Tengo una aplicación que necesita ejecutar varias otras aplicaciones en cadena. Los estoy ejecutando a través de ShellExecuteEx
. El orden de ejecución de cada una de las aplicaciones es muy importante porque dependen el uno del otro. Por ejemplo:Inicie la aplicación externa con ShellExecuteEx y espere hasta que se inicialice
Start(App1);
If App1.IsRunning then
Start(App2);
If App2.IsRunning then
Start(App3);
.........................
If App(N-1).IsRunning then
Start(App(N));
Todo funciona bien, pero no es un posible problema: ShellExecuteEx
inicia la aplicación, y regresar casi de inmediato. El problema puede surgir cuando, por ejemplo, App1
ha comenzado correctamente pero no ha terminado algunas tareas internas, todavía no está listo para usar. Pero ShellExecuteEx
ya está comenzando App2
que depende de App1
, y App2
no se iniciará correctamente porque necesita App1
totalmente inicializado.
Tenga en cuenta, que yo no quiero esperar a que App(N-1)
para terminar y luego empezar AppN
.
No sé si esto es posible resolver con ShellExecuteEx, he tratado de utilizar
SEInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC;
pero sin ningún efecto.
Después de iniciar la aplicación AppN
tengo un control para el proceso. Si asumo que la aplicación se inicializó después de que se creó su ventana principal (todas las aplicaciones tienen una ventana), ¿puedo poner un gancho en la cola de mensajes y esperar hasta que aparezca WM_CREATE
o quizás WM_ACTIVATE
? Ante la presencia de dicho mensaje, mi Aplicación sabría que puede seguir adelante.
Es solo una idea. Sin embargo, no sé cómo poner tal gancho. Entonces, si me pueden ayudar en esto o tienen una mejor idea, sería genial :)
Además, la solución debe funcionar en Windows XP y superior.
Gracias por su tiempo.
Editado
@Cosmic Prund: No entiendo por qué se elimina su respuesta? Tal vez intente con tu idea ...
WaitForInputIdle (hProcess ... –