C多个进程:创建子进程时程序崩溃

时间:2012-12-12 09:46:01

标签: windows winapi

我正在尝试使用以下命令创建子进程:

    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 ); 

它在这里崩溃,我不知道为什么。

  1. 现在我的原始进程需要命令行参数,所以我也必须在这里传递它们吗?如果是这样,那么因为我没有从int main()创建子进程所以我可以执行以下操作:

    LPTSTR szCmdline = TEXT(“nmctest -s TS -r DMR -tlLDMR”);

  2. 然后在CreateProcess()中传递szCmdline?

    有人可以帮我解释为什么会崩溃吗?

1 个答案:

答案 0 :(得分:3)

您的代码失败了,因为您正在为NULLlpApplicationName传递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);