Win32API【2】

このエントリーをはてなブックマークに追加
452デフォルトの名無しさん
「あるプロセスAから別のプロセスBをCreateProcessで起動して
 そのハンドルを取得し、終了までWaitForSingleObjectで待つ」
といった、ありがちなプログラムなのですが、プロセスBからさらに
さらにShellExecute()で別のプロセスCを起動しようとすると、
ロック状態に陥ってしまい、プロセスCが正しく起動されません。

・WaitForSingleObjectで待つ処理を抜けば正常動作します。
・完全にロックかと思いきや、なぜか30秒後ぐらいにプロセスCが
 正常に実行されます。(タイムアウト?)
・プロセスAを経由せずに直接プロセスBから起動すれば問題なし。
・ShellExecuteでなくてCreateProcessを使用すれば問題なし。

このような場合の回避策は存在するのでしょうか?
453デフォルトの名無しさん:02/01/29 17:27
>>452 今のプログラミング言語って呼び出しが入れ子になりがちだから
起動するプログラムと監視するプログラムは分けたほうが無難じゃないですか?

もっともおんなじ様なプログラムでWin2KでもWin98でも特に問題はないので
変数とかなにかメモリ処理とかあるいはなんか基本的なミスを起こしているように思うのでけど
>452
なにその現象、わかんねー!!!
455デフォルトの名無しさん:02/01/29 19:09
>>453
>>454
わかりにくくて、すいません(^_^;)
やろうとしていることを整理?しますと、

 1.ボタンを押したらShellExecute()でURLを開くアプリを作成

 2.このアプリを別のアプリからCreateProcessで起動すると
  ShellExecuteの実行に時間がかかる(30秒)

というものです。
WaitForSingleObjectでプロセスの終了を待っている訳ですが、
何故かShellExcuteの実行にまで影響を及ぼしているようです。
>>455
試してみたけど再現不能だった。
何か別の原因があったりしない?
457デフォルトの名無しさん:02/01/29 21:12
>>455
・すでに標準ブラウザが起動しているかどうかチェックするために
 ShellExecuteがDDEメッセージをブロードキャスト
・WaitForSingleObjectで終了を待っているためメッセージに
 応答できない
・タイムアウトまでロック

という筋書きかと。
 対策としては
1. 終了待ち専用のスレッドを作る。
2. MsgWaitForMultipleObjectsを使う。
お好きなほうをどうぞ。
458デフォルトの名無しさん:02/01/29 22:46
>>457
ありがとうございます。
ご教授いただいた筋書きが濃厚のようです。

試しに、URL指定でなく、通常の単なるEXEの起動であれば
>>452
の問題は一切発生しません。
(ShellExecuteを単なるプロセスの起動と思い込んでいました・・・)

対策の方、試してみます。
>>458
exeの起動ならDDEは使わないからね。