2

現在のディレクトリで MinGW ディストリビューションの make.exe を実行し、その STDOUT データと終了コードを利用するプログラムを作成しようとしています。CreatePipe で作成された、データをフェッチする STDOUT を処理するためのハンドルがあります。そのパイプで ERROR_HANDLE_EOF を取得すると、プロセスが終了したと想定し、その終了コードを取得しようとします。

if(session->pid == 0) return;
HANDLE hp = OpenProcess(PROCESS_QUERY_INFORMATION |
            PROCESS_TERMINATE, TRUE, session->pid);
if(hp == NULL) {
    printf("OpenProcess(%i) failed, error: %i\n",
        session->pid, (int)GetLastError());
    return;
}

私のコードは、テストした他のすべての MinGW ユーティリティ (pwd、ls など) で動作し、問題なく STDOUT と終了コードを取得できます。しかし、make で試してみると、上記のコードは次のメッセージを表示します。

「OpenProcess(2032) に失敗しました。エラー: 87」

エラーコード87をグーグルで検索したところ、「無効なパラメーター」と表示されました。2032 のような正のプロセス ID について何が無効なのかわかりません。何かアイデアはありますか?

4

3 に答える 3

7

PIDCreateProcessで使用する代わりに、からのハンドルを使用する必要があります。OpenProcess

OpenProcessプロセス オブジェクトがまだ存在する場合にのみ機能します。OpenProcessプロセスオブジェクトがなくなった場合に呼び出すまでに-結果は無効なパラメーターを使用した呼び出しになります。

他のユーティリティで得られた成功は、競合状態 (時々失敗する可能性があります) によるものか、子プロセスへの元のハンドルを開いたままにしていたためです。

于 2011-02-14T01:25:36.480 に答える