CreateProcess и WaitForSingleObject - это простой способ добиться этого: вы получаете дескриптор процесса из CreateProcess, затем ждете его с помощью WFSO, не забывая закрывать любые используемые вами дескрипторы. Но подождите ... есть проблема. Проблема в том, что - для процессов с графическим интерфейсом - оба процесса могут зависать. Почему?
Проблема возникает из-за того, что у вашего приложения есть окно, но оно не перекачивает сообщения. Если порожденное приложение вызывает SendMessage с одной из целей широковещания (HWND_BROADCAST
или HWND_TOPMOST
), то SendMessage не вернется в новое приложение, пока все приложения не обработают сообщение - но ваше приложение не может обработать сообщение потому что он не качает сообщения .... поэтому новое приложение блокируется, поэтому ваше ожидание никогда не будет успешным .... DEADLOCK.
Если у вас есть абсолютный контроль над порожденным приложением, то вы можете принять меры, такие как использование SendMessageTimeout, а не SendMessage (например, для инициализации DDE, если кто-то еще использует это). Но есть ситуации, которые вызывают неявные широковещательные рассылки SendMessage, над которыми у вас нет контроля, например, используя API-интерфейс SetSysColors.
Единственные безопасные способы обойти это: (а) разделить ожидание на отдельный поток, (б) использовать тайм-аут на ожидании и использовать PeekMessage в цикле ожидания, чтобы гарантировать, что вы перекачиваете сообщения, (в) использовать API MsgWaitForMultipleObjects вместо WaitForSingleObject.