0

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

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

然后在 CreateProcess() 中传递 szCmdline?

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

4

1 回答 1

3

您的代码失败了,因为您同时传递NULLlpApplicationNamelpCommandLine。您必须为其中至少一个传递一个值。文档清楚地说明了这一点。

看起来您还尝试将值传递给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);
于 2012-12-12T09:49:13.267 回答