1

STARTUPINFOへの呼び出しで次の構造を使用しますCreateProcess。プロセスの終了後に電話する必要がありCloseHandleますhStdErrorか?hStdInput

startupInfo.cb = sizeof(startupInfo);
startupInfo.cb = sizeof(si);
startupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
startupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
startupInfo.hStdOutput =  NULL;
startupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
startupInfo.wShowWindow = SW_HIDE;
4

2 に答える 2

3

これらのハンドルを開かなかったので(それはGetStdHandle そうではありません)、それらを閉じる必要はありません(おそらく、他の理由でそれらを閉じたいと思うかもしれませんが、それはありそうにありません)。(注:ハンドルを開いた場合でも プロセスが終了するのを待ってから閉じる必要はありません。ハンドルが継承されると、親プロセスでハンドルを閉じても子には影響しません)。

の代わりに hStdOutputすべきであることに注意してください:これは、でハンドルがないことを渡すための規則です。INVALID_HANDLE_VALUENULLSTARTUPINFO

于 2013-02-06T13:21:02.527 に答える
0

「あなたはする必要がありますか?」という質問に。-簡単な答えは「いいえ」です。プロセスが終了すると、それに接続されているすべてのハンドルがWindows OSで破棄されます。プロセス内でプロセスを作成している場合(Cでそれを試したくはありませんが、C#では非常に簡単です)、より安全です。子プロセスが終了前(または終了時)にそれ自体の後でクリーンアップされることを確認します。

これをテストする方法は、親プロセスで子プロセスを終了した後で、ハンドルにアクセスしてみることです。

于 2013-02-06T13:21:19.380 に答える