8

他のいくつかのアプリケーションをチェーンで実行する必要があるアプリケーションがあります。経由で実行していShellExecuteExます。各アプリを実行する順序は非常に重要です。これは、アプリが相互に依存しているためです。例えば:

Start(App1);

If App1.IsRunning then
  Start(App2);
If App2.IsRunning then
  Start(App3);
.........................
If App(N-1).IsRunning then
  Start(App(N));

すべて正常に動作しますが、考えられる問題が 1 つあり ShellExecuteExます。それは、アプリケーションを起動してすぐに戻ることです。たとえば、App1が適切に開始されたが、一部の内部タスクが完了していない場合や、まだ使用する準備ができていない場合に、問題が発生する可能性があります。しかし、 に依存するShellExecuteExはすでに開始されており、完全に初期化する必要があるため、適切に開始されません。App2App1App2App1

App(N-1)終了してから開始するのを待ちたくないことに注意してくださいAppN

これが ShellExecuteEx で解決できるかどうかはわかりません。使用しようとしました

SEInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC;

しかし、何の効果もありません。

アプリケーションを起動した後AppN、プロセスへのハンドルがあります。メインウィンドウが作成された後にアプリケーションが初期化されると仮定すると(すべてのアプリにウィンドウがあります)、メッセージキューにフックを配置して、表示されるまで待つことはできますWM_CREATEWM_ACTIVATE?このようなメッセージが表示されると、アプリケーションは先に進むことができることを認識します。

それはただのアイデアです。しかし、そのようなフックの付け方がわかりません。あなたがこれで私を助けることができれば、またはあなたは素晴らしいだろうより良いアイデアを持っています:)

また、ソリューションは Windows XP 以降で動作する必要があります。

御時間ありがとうございます。

編集済み

@Cosmic Prund: なぜ回答を削除したのかわかりません。あなたのアイデアを試すかもしれません...

4

3 に答える 3

13

WaitForInputIdle()によって返される各プロセス ハンドルでを呼び出すことで、おそらく必要なことを実現できますShellExecute()

指定されたプロセスが最初の入力の処理を終了し、保留中の入力がない状態でユーザー入力を待機するか、タイムアウト間隔が経過するまで待機します。

于 2011-07-01T11:44:57.457 に答える
4

アプリケーションに、UI スレッドで実行されないカスタム初期化ロジックがある場合、WaitForInputIdle は役に立たない可能性があります。その場合、初期化が完了したことを前のアプリに通知するメカニズムが必要です。

シグナリングには、名前付きパイプ、ソケット、RPC メカニズム、または単純なファイル ベースのロックを使用できます。

于 2011-07-01T12:12:03.660 に答える
0

両方のアプリケーションをコーディングしている限り、いつでもIPCInterpocess Synchronizationを使用して、アプリケーションを相互に通信 (および必要に応じて待機) させることができます。

于 2011-07-01T13:18:01.070 に答える