プロセスIDから、そのプロセスが終了したかを調べるには?

解決


柚子  2009-11-19 14:36:56  No: 71119  IP: [192.*.*.*]

質問させて頂きます。

予め取得したプロセスIDを基に、そのプロセスが終了したかを調べるにはどのような方法がありますか?
初めはOpenProcessで取得に失敗すれば、そのプロセスは終了だと思っておりましたが
OpenProcessでハンドルの取得に成功できたので、次はWaitForSingleObjectで簡単な待機をしても
終了したかうまく判断できません

WaitForSingleObjectで常に監視すればよいのですが
それは使用せず、あくまでプロセスIDを基に終了する方法がありましたら
ご教授の程お願いします。

編集 削除
オショウ  2009-11-19 17:46:20  No: 71120  IP: [192.*.*.*]

どうしてもC++だけなら・・・

WMI使ってやれば、該当のProcessIDを持ったプロセスが
どうなったか拾えると思います。

C++ CLIなら・・・.NET側のクラスライブラリ使えるの
でもっと簡単・・・

以上。参考まで

編集 削除
subaru  2009-11-19 21:53:45  No: 71121  IP: [192.*.*.*]

終了コードは GetExitCodeProcess で取得できます。
この関数はプロセスが終了していない場合に STILL_ACTIVE(=259)を返すのですが、
対象のプロセスが終了コードに 259 を返す可能性を考えると確実な終了判定ではありません。

なので、STILL_ACTIVE のときだけ WaitForSingleObject でタイムアウトするかどうかを
調べられれば終了判定可能と考えられますが、
>OpenProcessでハンドルの取得に成功できたので、次はWaitForSingleObjectで簡単な待機をしても
>終了したかうまく判断できません
具体的にどのようにうまくいっていないのでしょうか?

WMI でも Win32_Process でプロセスを列挙して判定できると思いますが
サービスを停止されると機能しないことに注意する必要はあります。

編集 削除
subaru  2009-11-20 10:51:53  No: 71122  IP: [192.*.*.*]

予め取得しているのはハンドルではなくプロセスIDだけでしたね。
OpenProcess成功しますか?
そもそも確認方法に問題があるのかもしれません。

編集 削除
オショウ  2009-11-20 11:09:04  No: 71123  IP: [192.*.*.*]

http://www.microsoft.com/japan/technet/scriptcenter/resources/scriptshop/shop0505.mspx

ここの最後に興味深いコードが掲載されてます。

WMIで、VBScriptですが・・・
少々?頑張れば、C++に移植できますネ!

以上。参考まで

編集 削除
柚子  2009-11-21 09:44:26  No: 71124  IP: [192.*.*.*]

オショウさん、subaruさんレス有難うございます。
OpenProcessの際、PROCESS_TERMINATEを指定していましたが
SYNCHRONIZEに変えることで解決しました。

ご教授頂き有難うございました。

編集 削除
aetos  2009-11-28 11:55:23  No: 71125  IP: [192.*.*.*]

プロセスIDは再利用されることがありますので、確実なチェックは無理でしょう。
WaitForSingleObject でも、待ち時間を 0 にすることで、待機することなく任意のタイミングでポーリングすることがきます。

編集 削除