无法在CreateProcess中传递命令行参数

时间:2015-07-16 20:20:32

标签: c++ qt createprocess

我在使用命令行参数的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);

2 个答案:

答案 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::wstringLPCWSTR等)正确提供为UTF16字符串。

但是,带有新进程参数的第二个参数在代码中不是UTF16(而是一个单字节字符集)并且为了避免编译器错误,您只需要转换指针并告诉编译器处理非UTF16内容为UTF16 理解为UTF16的“Param1 Param2 Param3”的字节不会给出任何正确的字符串而没有正确的转换,并且首先, 2字节 0值终止字符串,如Windows所要求的那样,在那里无处可去。结果是未定义的行为,任何奇怪的事情都可能发生。

让你的参数字符串就像你对路径所做的那样,一切都应该没问题。

答案 1 :(得分:0)

你有没有尝试过ShellExecuteA()?

相关问题