gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:10:02 31 4
gpt4 key购买 nike

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

最佳答案

CreateProcess 有两个版本(还有许多其他 Winapi 函数):

一个采用 ASCII/ISO88591 格式的“普通”字符串/无论每个字符有 1 个字节。
“abc”将包含数字 97 98 99

另一个 CreateProcess 采用 UTF16 字符串;每个字符有 2 或 4 个字节,
和“abc”将有字节数0 97 0 98 0 99
(UTF16 有点复杂,但在这种情况下,它只是添加了 0)。
优点是更好地支持国际化,因为
旧的 1 字节字符集对于俄语、希腊语等语言有问题。

您正在使用第二个版本。 path_lpcwstr,即。作为第一个参数的程序路径和名称由您正确提供为 UTF16 字符串(Windows 上的 std::wstringLPCWSTR 等...)。

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

像处理路径一样制作参数字符串,一切都应该没问题。

关于c++ - 无法在 CreateProcess 中传递命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31463803/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com