我有一个应用程序需要运行链中的其他几个应用程序。 我通过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
已经启动了依赖于App1
App2
,并且App2
将无法正常启动,因为它需要完全初始化App1
。
请注意,我不想等待App(N-1)
完成,然后启动AppN
。
我不知道这是否可以用ShellExecuteEx解决,我试过使用
SEInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC;
但没有任何影响。
启动AppN
应用程序后,我有一个处理过程。 如果我假设应用程序在创build主窗口(所有应用程序都有一个窗口)后初始化,我可以以某种方式在其消息队列中放置一个钩子,并等待直到WM_CREATE
出现或者可能是WM_ACTIVATE
? 在这样的信息的情况下,我的应用程序将知道它可以继续前进。
这只是一个想法。 但是,我不知道如何把这个钩子。 所以,如果你能帮助我,或者你有一个更好的主意,这将是伟大的:)
此外,该解决scheme必须在Windows XP及更高版本上运行。
谢谢你的时间。
编辑
@Cosmic Prund:我不明白你为什么删除你的答案? 我可能会尝试你的想法…
您可能可以通过调用ShellExecute()
返回的每个进程句柄上的WaitForInputIdle()
来实现所需的功能。
等待指定的过程完成其初始输入的处理,并等待用户输入未挂起输入,或等到超时间隔过去。
如果您的应用程序有一些自定义的初始化逻辑不能在UI线程中运行,那么WaitForInputIdle可能没有帮助。 在这种情况下,您需要一个机制来指示您已完成初始化的以前的应用程序。
对于信号,您可以使用命名管道,套接字,一些RPC机制或基于文件的简单锁定。
您始终可以使用IPC和Interpocess Synchronization使您的应用程序与其他应用程序(如果需要的话)进行通信(只要您需要)。