2011-07-01 14 views
7

私はチェーン内にいくつかの他のアプリケーションを実行する必要のあるアプリケーションを持っています。私はShellExecuteExで実行しています。各アプリを実行する順序は、互いに依存しているため非常に重要です。たとえば: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はすでにApp2を開始しています。これはApp1に依存し、App2は完全に初期化する必要があるため、正しく起動しません。App1

App(N-1)が終了してからAppNになるのを待つことはできません。

これはShellExecuteExをして解決することができる場合、私は知らないが、私は

SEInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC; 

が、いかなる影響を与えることなく使用することを試みました。

AppNアプリケーションを開始した後、私はそのプロセスを扱います。メインウィンドウが作成された後にアプリケーションが初期化されたと仮定すると(Appsのすべてにウィンドウがあります)、メッセージキューにフックを入れてWM_CREATEが表示されるか、またはWM_ACTIVATEまで待つことができますか?そのようなメッセージが表示されると、私のアプリケーションはそれが進むことができることを知ります。

これは単なるアイデアです。しかし、私はそのようなフックを置く方法を知らない。だからあなたがこれで私を助けることができれば、それは素晴らしいだろう良いアイデアを持っている:

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

お時間をいただきありがとうございます。

編集

@Cosmic PRUND:私はあなたがあなたの答えを削除しなかった理由を理解していませんか?私はあなたの考えを試してみるかもしれません...

+2

WaitForInputIdle(hProcess ... –

答えて

12

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

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

+0

David:これは本当に良いと思います;)しかし、実際には「指定されたプロセスは初期化を完了しました」ということですか? – Wodzu

+0

+1、素敵でシンプル。 @Wodzuは、 'FormCreate'で10秒間のダムループを持つ単純なアプリケーションを作成しただけで、ループが終了するとすぐに返されるWaitForInputIdle()とメインフォームが表示されます。 –

+0

ありがとう@コスミン、とにかくあなたはあなたの答えを削除したことは残念です。私もそれを賞賛したかった:) – Wodzu

3

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

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

+0

ありがとうHasan、しかし、私は言ったと私は、自分自身からの引用初期化によって意味を定義した "私はアプリケーションがメインウィンドウが作成された後(アプリケーションのすべてがウィンドウを持っている)初期化されていると仮定" – Wodzu

+0

WaitForInputIdleはあなた必要。 –

0

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

関連する問題