Запустите внешнее приложение с 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 , который зависит от App1 , и App2 не запускается должным образом, потому что ему необходимо полностью инициализировать ] App1 .

Обратите внимание, что я не хочу ждать, пока App (N-1) завершится, а затем запустить AppN .

I не знаю, возможно ли это решить с помощью ShellExecuteEx, я пытался использовать

SEInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC;

, но без всякого эффекта.

После запуска приложения AppN у меня есть дескриптор процесса. Если я предполагаю, что приложение инициализируется после создания его главного окна (все приложения имеют окно), могу ли я каким-то образом установить ловушку для его очереди сообщений и подождать, пока не появится WM_CREATE или, возможно, WM_ACTIVATE ? При наличии такого сообщения мое Приложение будет знать, что оно может двигаться дальше.

Это просто идея. Однако я не знаю, как поставить такой крючок. Так что, если бы вы могли помочь мне в этом или у вас есть идея получше, это было бы здорово :)

Кроме того, решение должно работать в Windows XP и выше.

Спасибо за ваше время.

Отредактировано

@Cosmic Prund: Я не понимаю, почему вы удалили свой ответ? Я могу попробовать вашу идею ...

8
задан Wodzu 1 July 2011 в 12:08
поделиться