我在使用命令行参数的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.我也尝试只将第一个参数指定为“C:\ my \ path \ myfile.exe Param1 Param2 Param3”但那也不起作用。
非常感谢任何帮助。
解决方案: 使用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);
答案 0 :(得分:1)
CreateProcess
有两个版本(以及许多其他Winapi函数):
一个接受ASCII / ISO88591中的“普通”字符串/无论每个字符有1个字节
“abc”会有数字97 98 99
。
另一个CreateProcess
接受UTF16字符串;每个char都有2或4个字节,
并且“abc”将具有字节编号0 97 0 98 0 99
(UTF16有点复杂,但在这种情况下,它只添加了0)
优势是更好地支持国际化,因为
旧的1字节字符集在俄语,希腊语等语言中存在问题。
你使用第二个版本。 path_lpcwstr
,即。程序路径和名称作为第一个参数,由您(Windows std::wstring
和LPCWSTR
等)正确提供为UTF16字符串。
但是,带有新进程参数的第二个参数在代码中不是UTF16(而是一个单字节字符集)并且为了避免编译器错误,您只需要转换指针并告诉编译器处理非UTF16内容为UTF16 理解为UTF16的“Param1 Param2 Param3”的字节不会给出任何正确的字符串而没有正确的转换,并且首先, 2字节 0值终止字符串,如Windows所要求的那样,在那里无处可去。结果是未定义的行为,任何奇怪的事情都可能发生。
让你的参数字符串就像你对路径所做的那样,一切都应该没问题。
答案 1 :(得分:0)
你有没有尝试过ShellExecuteA()?