ネットスケープ(ver4.73)のプロセス(netscape.exe)は、ネットスケープを
複数起動した場合も、最終的には、1回目に起動したプロセスに相乗りした
状態となるようです。
手順1)CreateProcessで1回目のnetscape.exeを起動
WaitForSingleObjectでプロセスの終了を待ちます
手順2)CreateProcessで2回目のnetscape.exeを起動
WaitForSingleObjectでプロセスの終了を待ちます
手順3)手順2)で起動したプロセスをブラウザの×ボタン押下により終了
【質問】
この場合に、手順2)で2回目に起動したプロセスの終了を検知出来ます
か?
実際にコードを上げているくらいなので実際にやってみた方が早いような気がしますけれど、
試してみていないのでしょうか?
試した結果から疑問が湧いて質問したのでしたら結果も出した方がよいと思いますけれど。
1回目に起動したプロセスに相乗りした状態というのもピンときませんし。
単に一回目に起動したプロセスと連携しているだけなら、一回目に起動したプロセスから
何らかのメッセージが飛んで終了を促しているのかもしれませんね。
そもそも同一プログラムなのですから、そういった仕組みを組み込むことは難しくありません
し。
手順2の状況でタスクマネージャでプロセスの状況は確認しましたか?
二つのプロセスが起動している状態になっているのでしょうか?
なんか自分で確認出来そうなことばかりのような気がするのですけれど。
PATIOさんのおっしゃる通りですね。
これまでに実際にやってみた内容を報告します。
□以下のコードを作成しました。
2回連続で実行したところ、2回目の起動時には、NN画面が残っている
にも関らず、プロセス終了を検知して、「ブラウザが終了しました。」の
メッセージが表示されてしまいます。
void main()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
memset(&pi,0,sizeof(pi));
CreateProcess(NULL,D:\\Program Files\\Netscape\\Netscape 6
\\netscp6.exe http://sv1/index.html,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
printf(pi.hProcess = %x\n, pi.hProcess);
printf(pi.hThread = %x\n, pi.hThread);
printf(pi.dwProcessId = %d\n, pi.dwProcessId);
printf(pi.dwThreadId = %d\n, pi.dwThreadId);
//ブラウザが閉じられるまで待ちます
if(WaitForSingleObject(pi.hProcess,INFINITE)==WAIT_OBJECT_0){
printf(ブラウザが終了しました。);
}
//プロセスハンドルを開放する
CloseHandle(pi.hProcess);
□手順2の状況でタスクマネージャでプロセスの状況を確認したところ、
一つのプロセスしか起動されていませんでした。
厳密に言うと、2回目も一瞬プロセスIDが見えるのですが、すぐに
消えて、1回目のプロセスのみとなってしまいます。
と言うことは、結論は出ているようですね。
二度目の起動では既に起動中のプロセスに開こうとしているURLを伝えて
自分は終了しているのでしょう。
この辺のテクニックは二重起動の防止関連でよくある物ですし、珍しい物ではありません。
従って、貴方が確認した通り、同時に二つのプロセスが立ち上がっているわけではない。
既に終わっているプロセスなので一つ目のプロセスが終了するタイミングで二つ目の終了の
検出はできない。
が答えになると思います。
結論でました。
ありがとうございました。
