我正在尝试使用以下命令创建子进程:
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
CreateProcess( NULL, // No module name (use command line)
NULL, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi );
它在这里崩溃,我不知道为什么。
现在我的原始进程需要命令行参数,所以我也必须在这里传递它们吗?如果是这样,那么因为我没有从int main()创建子进程所以我可以执行以下操作:
LPTSTR szCmdline = TEXT(“nmctest -s TS -r DMR -tlLDMR”);
然后在CreateProcess()中传递szCmdline?
有人可以帮我解释为什么会崩溃吗?
答案 0 :(得分:3)
您的代码失败了,因为您正在为NULL
和lpApplicationName
传递lpCommandLine
。您必须至少传递其中一个值。 documentation表明了这一点。
您似乎也尝试将值传递给lpCommandLine
。但是你已经传递了一个不可修改的字符串文字。文档再次明确表示不允许这样做。将指针传递给可以修改的内存。
此函数的Unicode版本CreateProcessW可以修改此字符串的内容。因此,此参数不能是只读内存的指针(例如const变量或文字字符串)。如果此参数是常量字符串,则该函数可能会导致访问冲突。
你可以满足这样的要求:
TCHAR szCmdline[] = _T("nmctest -s TS -r DMR -tlLDMR");
就个人而言,我认为在这个时代不需要TCHAR
。当然你还没有为Windows 98编写程序?我会这样做:
wchar_t szCmdline[] = L"nmctest -s TS -r DMR -tlLDMR";
代码中另一个可能的失败向量是STARTUPINFO
参数。确保您已正确初始化。最简单的方法就是这样:
STARTUPINFO si = {0};
si.cb = sizeof(si);
但您可能希望添加对GetStartupInfo
的调用。
STARTUPINFO si = {0};
si.cb = sizeof(si);
GetStartupInfo(&si);