我有以下测试代码:
#define CMDLINE ".\\dummyFolder\\dummyProc.exe op1 op2 op3"
int main(int argc, char **argv) {
STARTUPINFO info;
info.cb = sizeof(STARTUPINFO);
info.lpReserved = NULL;
info.cbReserved2 = 0;
info.lpReserved2 = NULL;
PROCESS_INFORMATION processInfo;
SECURITY_ATTRIBUTES procAttr;
procAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
procAttr.lpSecurityDescriptor = NULL;
procAttr.bInheritHandle = false;
SECURITY_ATTRIBUTES threadAttr;
procAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
procAttr.lpSecurityDescriptor = NULL;
procAttr.bInheritHandle = false;
bool handlersInheritable = true;
char cmdLine2[sizeof(CMDLINE)];
strcpy(cmdLine2, CMDLINE);
char AppName[sizeof(".\\dummyFolder\\dummyProc.exe")];
strcpy(AppName, ".\\dummyFolder\\dummyProc.exe");
if (CreateProcess(AppName, cmdLine2, &procAttr, &threadAttr,
handlersInheritable, 0, NULL, NULL, &info, &processInfo)) {
//::WaitForMultipleObjects(procQty, handlers, waitForAll, waitInterval);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
CloseHandle(info.hStdError);
CloseHandle(info.hStdInput);
CloseHandle(info.hStdOutput);
} else {
std::cout << "Returned: " << GetLastError() << std::endl;
}
std::cout << "Exiting main process" << std::endl;
return 0;
}
这只是用于在Windows中创建进程的测试代码。问题是,当我启动“dummyProc.exe”时,出现0xc0000142错误。
进程dummyProc.exe可从命令行正常运行,但不能在代码内运行。
如果有帮助,这是dummyProc代码:
int main(int argc, char **argv) {
std::cout << "Working!!!!" << std::endl << "Receivedi: " << std::endl;
for (int i = 0; i < argc; ++i)
std::cout << argv[i] << std::endl;
return 0;
}
那么,有什么想法吗?
最佳答案
最明显的是char cmdLine2[sizeof(CMDLINE)];
声明了一个长度等于您的计算机指针大小的字符串。您需要改用strlen(CMDLINE)+1
。对于appName
也是如此。
注意CreateProcess
的第一个参数不需要是可写的。只需将字符串文字直接传递给它即可。不需要appName
变量。
至于确实需要写的lpCommandLine
,最简单的方法是这样的:
char cmdline[] = "op1 op2 op3";
这为您提供了可写的缓冲区。请注意,您不需要重复可执行文件的名称。
另一个问题是您尚未将所有参数初始化为
CreateProcess
。例如,STARTUPINFO
结构具有19个字段,而您仅初始化3。应将所有结构初始化为0,然后填写需要为非零的所有字段。像这样:STARTUPINFO info = { 0 };
对您通过的所有结构执行此操作。
您可以并且应该为
NULL
和lpProcessAttributes
参数传递lpThreadAttributes
。