0

我在 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中编译的。

有什么帮助吗?

4

1 回答 1

4

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

您第二次调用它时,这些值显然是这样的,即CreateProcess您认为您已要求它做一些它知道该怎么做的事情,因此它会继续进行。这就是未定义行为的本质。

要解决此问题,请初始化所有结构:

STARTUPINFO si = {sizeof(STARTUPINFO)};
于 2013-01-18T21:29:12.513 回答