Ваш код должен проверять и обрабатывать ошибки. И CreateEvent
, и OpenEvent
вернут NULL
, если они потерпят неудачу, в этом случае вам нужно проверить ошибку, используя GetLastError
.
Ваши звонки на номера WaitForSingleObject
и SetEvent
также должны проверяться в соответствии с документами MSDN.
Порядок, в котором вам нужно выполнять действия в родительском процессе:
- CreateEvent
- Запустить дочерний процесс
- WaitForSingleObject.
В противном случае вы столкнетесь с проблемой, вызванной @Mark Tolonen.
Было бы также лучше установить тайм-аут на ожидание, чтобы обработать случай, когда дочерний процесс не запускается, неожиданно завершает работу или зависает.
Альтернативный подход, если вы намереваетесь использовать это отношение родитель / потомок, состоит в том, чтобы разрешить наследование дескриптора события. Тогда событие не нужно называть по имени, и никто другой не может «присесть» на него в DoS-атаке на ваши приложения. Вы можете передать значение дескриптора дочернему элементу в качестве параметра командной строки. Это делается с помощью поля bInheritHandle
в параметре eventAttributes
для CreateEvent
.
Булево значение, которое указывает,
возвращенный дескриптор наследуется, когда
новый процесс создан. Если это
член ИСТИНА, новый процесс
наследует ручку.