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) 2 回目は機能しますが、一時停止状態の子プロセスが作成され、親プロセスの CPU 使用率が 100% になります。

私はwinXP sp3でテストしており、私のdllはvs 2010でコンパイルされました.

助けはありますか?

4

1 に答える 1

4

cbSize構造体のフィールドを初期化しSTARTUPINFOましたが、残りは初期化されていません。初めて を呼び出したCreateProcessとき、初期化されていない値は明らかに間違っているため、関数はそれらが間違っていることを認識してあきらめます。あなたはラッキーでした。

2 回目の呼び出しでは、 がCreateProcess実行方法を知っていることを実行するように要求したと考えるような値になっているようです。これが未定義の動作の性質です。

これを修正するには、すべての構造体を初期化します。

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