質問させて頂きます。
予め取得したプロセスIDを基に、そのプロセスが終了したかを調べるにはどのような方法がありますか?
初めはOpenProcessで取得に失敗すれば、そのプロセスは終了だと思っておりましたが
OpenProcessでハンドルの取得に成功できたので、次はWaitForSingleObjectで簡単な待機をしても
終了したかうまく判断できません
WaitForSingleObjectで常に監視すればよいのですが
それは使用せず、あくまでプロセスIDを基に終了する方法がありましたら
ご教授の程お願いします。
どうしてもC++だけなら・・・
WMI使ってやれば、該当のProcessIDを持ったプロセスが
どうなったか拾えると思います。
C++ CLIなら・・・.NET側のクラスライブラリ使えるの
でもっと簡単・・・
以上。参考まで
終了コードは GetExitCodeProcess で取得できます。
この関数はプロセスが終了していない場合に STILL_ACTIVE(=259)を返すのですが、
対象のプロセスが終了コードに 259 を返す可能性を考えると確実な終了判定ではありません。
なので、STILL_ACTIVE のときだけ WaitForSingleObject でタイムアウトするかどうかを
調べられれば終了判定可能と考えられますが、
>OpenProcessでハンドルの取得に成功できたので、次はWaitForSingleObjectで簡単な待機をしても
>終了したかうまく判断できません
具体的にどのようにうまくいっていないのでしょうか?
WMI でも Win32_Process でプロセスを列挙して判定できると思いますが
サービスを停止されると機能しないことに注意する必要はあります。
予め取得しているのはハンドルではなくプロセスIDだけでしたね。
OpenProcess成功しますか?
そもそも確認方法に問題があるのかもしれません。
http://www.microsoft.com/japan/technet/scriptcenter/resources/scriptshop/shop0505.mspx
ここの最後に興味深いコードが掲載されてます。
WMIで、VBScriptですが・・・
少々?頑張れば、C++に移植できますネ!
以上。参考まで
オショウさん、subaruさんレス有難うございます。
OpenProcessの際、PROCESS_TERMINATEを指定していましたが
SYNCHRONIZEに変えることで解決しました。
ご教授頂き有難うございました。
プロセスIDは再利用されることがありますので、確実なチェックは無理でしょう。
WaitForSingleObject でも、待ち時間を 0 にすることで、待機することなく任意のタイミングでポーリングすることがきます。