我在使用带有命令行参数的CreateProcess时遇到麻烦。我已经阅读了所有找到的帖子,但是没有一种解决方案有效。
这是我所拥有的:
std::string path = "C:\\my\\path\\myfile.exe";
std::wstring stemp = std::wstring(path.begin(), path.end());
LPCWSTR path_lpcwstr = stemp.c_str();
std::string params = " Param1 Param2 Param3";
STARTUPINFO info = { sizeof(info) };
PROCESS_INFORMATION processInfo;
CreateProcess(path_lpcwstr, LPTSTR(params.c_str()), NULL, NULL, TRUE, CREATE_NEW_PROCESS_GROUP, NULL, NULL, &info, &processInfo);
代码可以正常工作,并且打开了myfile.exe(一个QT应用程序),但argc始终为1。也不行。
任何帮助是极大的赞赏。
解:
使用CreateProcessA并相应地更改参数可以解决答案之一指出的问题。
STARTUPINFOA info = { sizeof(info) };
PROCESS_INFORMATION processInfo;
std::string path = "C:\\my\\path\\myfile.exe";
std::string params = " Param1 Param2 Param3";
CreateProcessA(path.c_str(), const_cast<char *>(config.c_str()) , NULL, NULL, TRUE, CREATE_NEW_PROCESS_GROUP, NULL, NULL, &info, &processInfo);
最佳答案
CreateProcess
有两个版本(还有许多其他Winapi函数):
无论每个字符有1个字节,无论是ASCII / ISO88591 /中的“正常”字符串,都是这样。
“ abc”的数字为97 98 99
。
另一个CreateProcess
采用UTF16字符串;每个字符在那里有2或4个字节,
和“ abc”的字节数为0 97 0 98 0 99
(UTF16有点复杂,但是在这种情况下,它仅添加了0)。
优点是可以更好地支持国际化,因为
旧的1字节字符集在诸如俄语,希腊语等语言方面存在问题。
您正在使用第二个版本。 path_lpcwstr
,即程序路径和名称作为第一个参数,已由您正确地作为UTF16字符串提供(在Windows上为std::wstring
,在LPCWSTR
等下...)。
但是,带有新过程参数的第二个参数在您的代码中不是UTF16(而是一个字节的字符集),并且为了避免编译器错误,您只需投射一个指针并告诉编译器对待not-UTF16内容为UTF16。
如果没有适当的转换,被理解为UTF16的“ Param1 Param2 Param3”字节将不会给出任何理智的字符串,并且开始时,Windows要求的2字节0值来终止该字符串,就在那里。结果是不确定的行为,任何奇怪的事情都可能发生。
使参数字符串像使用路径一样,一切都应该没问题。