【问题标题】:C Multiple processes: Program crashes while creating child processC多进程:创建子进程时程序崩溃
【发布时间】:2012-11-29 23:47:18
【问题描述】:

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

    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?

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

【问题讨论】:

  • 是的,我尝试通过 szCmdline,但它仍然崩溃,但为什么?
  • 您可能还想向我们展示您如何声明和初始化sipi
  • FWIW STARTUPINFO si = {0}; 是对结构进行零初始化的惯用方式。不需要ZeroMemory

标签: windows winapi


【解决方案1】:

您的代码失败了,因为您同时为 lpApplicationNamelpCommandLine 传递了 NULL。您必须为其中至少一个传递一个值。 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);

【讨论】:

  • 我尝试将 szCmdline 传递给第二个参数,但它仍然崩溃
  • @Sunny 我无法调试该问题,因为我看不到您的代码版本。但是请注意,如果您正在调用CreateProcessW,那么lpCommandLine 必须引用可修改内存。您不能传递文字。同样,文档说明了这一点。
  • 你能告诉我如何为 szCmdline 做到这一点吗?
  • 谢谢让我快速尝试一下。也谢谢你的解释。
  • 我收到以下错误和警告:warning C4013: '_T' undefined;假设 extern 返回 int 错误 C2099: initializer is not a constant
猜你喜欢
  • 2011-06-24
  • 1970-01-01
  • 2015-06-09
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 2015-02-12
相关资源
最近更新 更多