CreateProcess 命令行参数

Posted

技术标签:

【中文标题】CreateProcess 命令行参数【英文标题】:CreateProcess command line arguments 【发布时间】:2017-01-04 13:18:50 【问题描述】:

我在使用 CreateProcess() 时遇到了一点问题。

在这个例子中,CreateProcess() 工作得很好:

bSuccess = CreateProcess(
                TEXT("os-util.exe"), 
                TEXT("os-util.exe 0x273e:0x0007:0x0100 --get-channel"), NULL, NULL, TRUE, 
                0,  
                NULL, szFileName, &si, &pi);

问题是我想修改我传递的命令行。我尝试了一些解决方案,但它们没有给我任何好的结果。例如:

LPWSTR cmdArgslistSetChannel[] =  TEXT("os-util.exe"), TEXT("0x273e:0x0007:0x0100"), TEXT("--set-channel"), TEXT("11") ;
bSuccess = CreateProcess(
                TEXT("os-util.exe"),
                cmdArgslistSetChannel, NULL, NULL, TRUE, 
                0,  
                NULL, szFileName, &si, &pi);

    如何只更改TEXT("") 的一部分?

    如何从多个TEXT("") 生成命令行?

如果这些选项都不可用,该怎么办?我想要一个 UI 按钮按下以使用不同的命令行参数调用 CreateProcess()

【问题讨论】:

你为什么首先使用 TEXT。你真的需要支持Windows 98吗?为什么不与时俱进,使用Unicode?​​span> cmdArgslistSetChannel 必须是 PWSTR 但不是 PWSTR* 就像你的代码一样。所以你的问题是如何格式化字符串? 看起来您只需要附加到您的字符串?那应该很容易。如果你检查documentation for CreateProcess,它不接受第二个参数中的字符串数组,所以不确定你在那里尝试什么。 我记得CreateProcess 的命令参数必须是可变的。更改文字是未定义的行为。所以,使用例如std::wstring. 我再问你一次,你为什么用TEXT?您真的需要以 Windows 98 为目标吗?你为什么决定这样写代码?我的猜测是您在不理解的情况下复制了一个示例。下一步:获得这种理解。 【参考方案1】:

使用std::wstring 和字符串连接来动态构建你的命令行,例如:

std::wstring cmdArgslistSetChannel = L"os-util.exe";
cmdArgslistSetChannel += L" 0x273e:0x0007:0x0100";
cmdArgslistSetChannel += L" --set-channel";
cmdArgslistSetChannel += L" 11";
bSuccess = CreateProcessW(
                L"os-util.exe",
                &cmdArgslistSetChannel[0],
                NULL, NULL, TRUE, 0,  
                NULL, szFileName, &si, &pi);

或者,使用std::wostringstream 进行构建,然后从中检索std::wstring

std::wostringstream cmdArgslistSetChannel;
cmdArgslistSetChannel << L"os-util.exe";
cmdArgslistSetChannel << L" " << L"0x273e:0x0007:0x0100";
cmdArgslistSetChannel << L" " << L"--set-channel";
cmdArgslistSetChannel << L" " << L"11";

std::wstring cmd = cmdArgslistSetChannel.str();
bSuccess = CreateProcessW(
                L"os-util.exe",
                &cmd[0],
                NULL, NULL, TRUE, 0,  
                NULL, szFileName, &si, &pi);

无论哪种方式,您都可以根据需要替换任何单个子字符串。

【讨论】:

lpApplicationNamelpCommandLine 都传递给 CreateProcess 是非常罕见的。唯一有意义的情况是,如果您不想将可执行映像作为第一个命令行参数传递。由于您正在实施标准 C 约定以将可执行映像作为第一个命令行参数传递,因此只需将 nullptr 传递给 lpApplicationName

以上是关于CreateProcess 命令行参数的主要内容,如果未能解决你的问题,请参考以下文章

c ++ createprocess - 命令行参数的字符串var - 没有发生任何事情

CreateProcess的前两个参数究竟怎么用

CreateProcess 挂钩以添加命令行

pyinstallerexe无法createprocess调用

allure命令行参数

什么是命令行参数?本人是c++菜鸟