Завершение процесса в окнах C/C++
Я пытаюсь поймать время, когда процесс заканчивается (убивая его, например, в TaskManager). сделать это, когда он обнаружит (внутри процесса, который был завершен), прежде чем выйти, чтобы сделать какую-то работу. Приложение мое не заканчивается byitslef (бесконечный цикл)
Я пытался: 1) atexit 2) SetUnhandledExceptionFilter
Я попытался в режиме отладки просто закрыть приложение, которое запускается, но оно не дошло до того, чтобы выполнить дополнительную задачу в конце.
Помогите,
3 ответа
Это должно ответить на ваш вопрос:
Есть два способа убить приложение в диспетчере задач.
Убийство через вкладку Приложения примерно эквивалентно SIGTERM(в Linux). Приложение может перехватить его и выполнить дополнительную обработку, поскольку оно в основном отправляет сообщение "закрыть окно". Сообщение для ловли - WM_CLOSE.
Вкладка "Уничтожение через процессы" будет примерно эквивалентна SIGKILL(в Linux). Вы ничего не можете сделать, чтобы перехватить это, кроме мониторинга действий пользователя в окне списка диспетчера задач и кнопки "Завершить процесс", или наличия контрольного процесса, который будет видеть, когда убит первый
В консольных приложениях вы должны рассмотреть возможность установки функции обратного вызова HandlerRoutine для перехвата CTRL_C_EVENT, CTRL_BREAK_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, CTRL_SHUTDOWN_EVENT.
В приложениях с графическим интерфейсом вы должны рассмотреть обработку WM_CLOSE, WM_QUERYENDSESSION, WM_ENDSESSION.
Перечислите все запущенные процессы. Как только вы это сделаете, вы получите идентификаторы процессов. Получите дескриптор каждого процесса через ранее полученный идентификатор и найдите процесс, который вы ищете. Используйте тот же дескриптор процесса в отдельном потоке, как это:
WaitForSingleObject (hProcess, INFINITE);
Как только процесс завершается, этот поток завершается.