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));

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

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

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

SEInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC;

但没有任何影响。

启动AppN应用程序后,我可以处理该过程。如果我假设应用程序在其主窗口创建后被初始化(所有应用程序都有一个窗口),我可以以某种方式在其消息队列上放置一个钩子并等待直到WM_CREATE出现或可能WM_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 回答