使用ShellExecuteEx启动外部应用程序并等待它初始化

时间:2011-07-01 11:33:32

标签: windows delphi winapi 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));

一切正常,但有一个可能的问题: ShellExecuteEx启动应用程序,几乎立即返回。例如App1已正确启动但尚未完成某些内部任务,但尚未准备好使用时,可能会出现此问题。但是ShellExecuteEx已经开始App2,这取决于App1App2将无法正常启动,因为它需要完全初始化App1

请注意,我不想等App(N-1)完成,然后开始AppN

我不知道这是否可以用ShellExecuteEx解决,我试过用

SEInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC;

但没有任何影响。

启动AppN应用程序后,我有一个处理过程。如果我假设应用程序在创建主窗口后被初始化(所有应用程序都有一个窗口),我可以以某种方式在其消息队列上放置一个挂钩并等到WM_CREATE出现或者WM_ACTIVATE?在存在此类消息的情况下,我的应用程序将知道它可以继续。

这只是一个想法。但是,我不知道如何把这样的钩子。所以,如果你可以帮助我,或者你有一个更好的想法,那将是伟大的:)

此外,该解决方案必须适用于Windows XP及更高版本。

感谢您的时间。

被修改

@Cosmic Prund:我不明白你为什么删除你的答案?我可能会尝试你的想法......

3 个答案:

答案 0 :(得分:12)

通过在ShellExecute()返回的每个进程句柄上调用WaitForInputIdle(),您可以实现所需。

  

等待指定的进程完成处理其初始输入并等待没有输入待处理的用户输入,或等待超时间隔结束。

答案 1 :(得分:3)

如果您的应用程序有一些不在UI线程中运行的自定义初始化逻辑,那么WaitForInputIdle可能没有帮助。在这种情况下,您需要一种机制来向先前的应用程序发出初始化信号。

对于信令,您可以使用命名管道,套接字,某些RPC机制或基于简单文件的锁定。

答案 2 :(得分:0)

只要您对两个应用程序进行编码,就可以始终使用IPCInterpocess Synchronization让您的应用程序与对方进行通信(并等待,如果需要)。