【问题标题】:createprocess suspended by default [closed]createprocess默认暂停[关闭]
【发布时间】:2013-01-18 21:14:18
【问题描述】:

我在 dll 中有这个函数:

int createChildProcess()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    int res;

    si.cb=sizeof(STARTUPINFO);

    STARTUPINFO* ptr=&si;
    if(!CreateProcess(L"c:\\windows\\notepad.exe", NULL, 0, 0, false, CREATE_NEW_CONSOLE, 0, 0, &si, &pi))
    {
        mylog << "CreateProcess error: " << GetLastError() << std::endl;
        res = 0;
    }
    else
        res = pi.dwProcessId;

    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );

    return res;
}

我发现了 2 个问题:

1) 函数第一次调用,总是返回错误码87(参数错误)。

2) 第二次,函数工作,但是创建了一个处于挂起状态的子进程,并且父进程的cpu使用率达到100%。

我用winXP sp3测试,我的dll是用vs 2010编译的。

有什么帮助吗?

【问题讨论】:

  • 您在STARTUPINFO 结构中初始化的唯一内容是cb 成员。其余的是未初始化的垃圾。结果将是不可预测的。
  • 嗯,所以你认为是 STARTUPINFO?

标签: c++ winapi createprocess


【解决方案1】:

您已经初始化了 STARTUPINFO 结构的 cbSize 字段,但是您没有初始化其余部分。第一次调用CreateProcess 时,未初始化的值显然非常错误,以至于函数认识到它们是错误的并放弃了。你是幸运的

您第二次调用它时,这些值显然是这样的,CreateProcess 认为您已要求它执行它知道如何执行的操作,因此它会继续执行。这就是未定义行为的本质。

要解决这个问题,请初始化结构的 all

STARTUPINFO si = {sizeof(STARTUPINFO)};

【讨论】:

  • 好的,我做了一些修改添加你的建议,现在错误码一直是1。
  • 可能是因为您告诉它为非控制台程序创建一个新控制台。但这超出了这个问题的范围,这就是为什么进程被暂停。
  • 你是对的。谢谢罗伯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 2023-03-12
  • 2022-06-15
  • 2015-08-14
  • 2021-06-15
相关资源
最近更新 更多