我想创建一个读取某些串口的进程。但是,用户应该能够在将来更改程序所在的路径。这就是为什么我想要包含变量BasePathFile,它在类的初始化期间设置为默认值:
const std::string BP = "C:\\aerospec_developement\\";
...
BasePathFile = BP;
...
有人可以解释为什么// 1不起作用,但// 2很好
void AerospecGUI::ReadPressure()
{
//1 const char *Args = ("C:\\Windows\\System32\\cmd.exe /C powershell /C "+ BasePathFile+"sourcecode\\pressure.ps1 -comport COM4 -baud 1200 -parity None -data 8 -stopbits one").c_str();
//2 const char *Args = "C:\\Windows\\System32\\cmd.exe /C powershell /C C:\\aerospec_developement\\sourcecode\\pressure.ps1 -comport COM4 -baud 1200 -parity None -data 8 -stopbits one";
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInfo;
memset(&StartupInfo, 0, sizeof(StartupInfo));
memset(&ProcessInfo, 0, sizeof(ProcessInfo));
StartupInfo.cb = sizeof(StartupInfo);
wchar_t wargs[1000];
mbstowcs(wargs, Args, strlen(Args)+1);//Plus null
LPWSTR argsptr = wargs;
bool result = CreateProcess(NULL, argsptr, NULL, NULL, FALSE, NULL, NULL, NULL,
&StartupInfo, &ProcessInfo);
...
此外,作者在另一个函数中写了一个非常相似的行。但是这个有用了。
bool AerospecGUI::FTP(std::string command, std::string file)
{
// This function executes a batch script with the given parameters. The batch script
// generates a .ftp file which contains the commands to perform the action given by "command"
// (get, put, delete).
const char *Args = ("C:\\Windows\\System32\\cmd.exe /C "+BasePathFile +"FTP\\FileTransfer.bat " + ServerURL + " root password " + command + " " + BasePathFile + "FTP\\ " + file +" " + BasePathFile + "FTP\\" + file.substr(0,file.size()-4)+".ftp").c_str();
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInfo;
memset(&StartupInfo, 0, sizeof(StartupInfo));
memset(&ProcessInfo, 0, sizeof(ProcessInfo));
StartupInfo.cb = sizeof(StartupInfo);
wchar_t wargs[1000];
mbstowcs(wargs, Args, strlen(Args)+1);//Plus null
LPWSTR argsptr = wargs;
...
答案 0 :(得分:1)
对于1
,您创建一个临时 std::string
对象,并获取指向其内部字符串的指针。一旦临时对象被破坏,字符串就不再存在,指针也不会指向任何有效的状态。
对于2
,你有一个实际的常量字符串文字,他有一个程序的生命周期,永远不会停止存在。
这似乎适用于你的第二个例子只是一个侥幸。您使用迷路无效指针所拥有的是未定义的行为,有时这些似乎可以正常工作。
答案 1 :(得分:1)
1
并且原始作者代码错误:c_str()
返回指向类似C的字符串的指针,但它是std::string
类的成员函数(请参阅{ {3}})。在std::string
对象过期后取消引用其指针是未定义的行为(可能有效也可能无效)。
2
可以正常工作
const char *Args = "C:\\... one";
因为它是一个字符串文字,它的生命周期跨越整个程序执行。