Как узнать, когда CreateProcess действительно запустила процесс? - PullRequest
2 голосов
/ 15 февраля 2011

У меня возникли проблемы, которые сводятся к желанию CreateProcess были StartProcess.Проблема в том, что существуют обстоятельства, при которых CreateProcess возвращает значение true, когда создает процесс, но система не может запустить процесс.Например, CreateProcess будет успешным даже в том случае, если невозможно разрешить импорт одного из запусков.

Существует, вероятно, дюжина предложений, которые можно сделать в зависимости от того, чего именно я надеюсь достичь, запустив этот процесс.Тем не менее, я боюсь, что ни одно из этих предложений, вероятно, не будет полезным, потому что я не надеюсь достичь каких-либо конкретных результатов, запустив этот процесс.

Одним из примеров может быть вызов WaitForSingleObject противдескриптор процесса и затем GetExitCodeProcess.Но я не могу дождаться завершения процесса, потому что он может остаться навсегда.

Другим примером предложения может быть вызов WaitForInputIdle, который будет работать хорошо, если я надеюсь связаться с лаунчи посредствомокно, которое я мог разумно ожидать, что лаунчи создаст.Но я не надеюсь на это и не могу этого ожидать.Насколько я знаю, launchchee является консольным процессом и / или никогда не будет иметь очереди сообщений.Кроме того, я не могу позволить себе ждать (с эвристическим намерением), чтобы выяснить это.

На самом деле, я ничего не могу предположить о лаунчи.

Чтобы получить лучшую идеюо том, как я думаю здесь, давайте посмотрим на оборотную сторону вопроса.Если процесс не запускается, я хочу код ошибки, который говорит мне, как я мог бы посоветовать пользователю.Если импорт завершен, основной поток обнаруживает, что собирается перейти к коду запуска CRT (или эквивалентному), а код ошибки, который я получаю, - ERROR_SUCCESS, отлично!Но я на самом деле не заинтересован в лаунчи и просто хочу обеспечить хороший пользовательский опыт в лаунчере.

О, и еще одна вещь: я хочу, чтобы это было просто.Я не хочу писать отладчик.: -)

Идеи?

Ответы [ 2 ]

1 голос
/ 15 февраля 2011

Одним из примеров может быть вызов WaitForSingleObject для дескриптора процесса, а затем GetExitCodeProcess.Но я не могу дождаться завершения процесса, потому что он может остаться навсегда.

Почему бы вам не дождаться дескриптора процесса какое-то разумное время.Если таймер истекает до того, как дескриптор сигнализирует, вы можете предположить, что процесс запущен и работает.Если дескриптор сигнализируется первым, а код выхода в порядке, то можно предположить, что он выполнил и успешно завершил.

Если вы его еще не видели, проблема CreateProcess против запущенной была упомянута в Блог Раймонда Чена .

Честно говоря, если вы не готовы принять эвристику (например, «она не закончилась с кодом ошибки через три секунды, поэтому мы предполагаем, что все хорошо»), товам придется написать «отладчик», под которым я имею в виду проверку внутренних компонентов запущенного процесса.

0 голосов
/ 07 августа 2011

Этот вопрос так долго не давал ответа, что я подозреваю, что можно с уверенностью заключить, что ответ: «Вы не можете».

...