【发布时间】:2012-03-13 19:14:06
【问题描述】:
我正在尝试使用 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() 函数的内部发生什么变化,都可以在不占用其他内存的情况下这样做。至少,当我这样做时,我是这么想的。
【问题讨论】:
-
不相关,但您正在泄漏内存,为什么有人会使用
memset而不是简单的()?
标签: c++ windows winapi createprocess