gpt4 book ai didi

c++ - 传递给 CreateProcess 的参数未按我预期的那样进行解析

转载 作者:可可西里 更新时间:2023-11-01 11:09:10 25 4
gpt4 key购买 nike

我正在尝试使用 devcon.exe 检查各种硬件的状态。在这个例子中,我试图检查我的 SATA HBA 状态,但 devcon 提示它。这是代码:

int main(int argc, char** argv) {
std::string cmdLine("\"C:\\Users\\afalanga\\Documents\\Visual Studio 2010\\Projects\\PlayGround\\Debug\\devcon.exe\" status PCI\\VEN_8086^&DEV_3A22^&SUBSYS_75201462^&REV_00");

char* pCmdLine(new char[cmdLine.length() + 10]);
memset(pCmdLine, 0, cmdLine.length() + 10);

for(int i(0); i < cmdLine.length(); i++)
pCmdLine[i] = cmdLine.at(i);

STARTUPINFO si = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION pi = {0};

if(!CreateProcess(NULL, pCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
std::cout << "Create child process failed. Error code: "
<< GetLastError() << std::endl;
return 1;
}

WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);

return 0;
}

问题是当上述执行时,devcon 提示说,“没有找到匹配的设备。”但是,如果我将该命令行从调试器复制/粘贴到我的命令提示符中并按下回车键(或者当然删除调试器放在它周围的所有引号),该命令将按预期完美执行。

我在处理字符串时犯了什么错误?以上是阅读 MSDN 上的 CreateProcess() 文档的结果(发现第一个参数不一定需要,cmd args 根本不应该去那里)。我分配 10 个额外字节的内存来将字符串复制到其中的原因是,“无论什么”可能会在 CreateProcess() 函数的内部发生变化,而不会占用其他内存。至少,当时我是这么想的。

最佳答案

Command line metacharacters are parsed by the command processor .特别是您正在使用 ^ 来防止 CMD.EXE 在与符号处中断命令。但是您正在直接执行程序,绕过 CMD.EXE。因此,^ 传递给被它们弄糊涂的 devcon.exe

解决方案:删除^字符。

您的问题实际上与您的标题相反。您传递给 CreateProcess 的命令行正在完全按照您指定的方式直接传递给应用程序。

关于c++ - 传递给 CreateProcess 的参数未按我预期的那样进行解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9690508/

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