завершение процесса в окнах C / C ++ - PullRequest
2 голосов
/ 03 ноября 2011

Я пытаюсь поймать время, когда процесс заканчивается (например, убив его в taskmanager). сделать это, когда он обнаружит (внутри процесса, который был завершен), прежде чем выйти, чтобы сделать какую-то работу. Моя заявка не заканчивается byitslef (бесконечный цикл)

Я пытался: 1) atexit 2) SetUnhandledExceptionFilter

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

Помощь

Ответы [ 3 ]

4 голосов
/ 03 ноября 2011

Это должно ответить на ваш вопрос:

Существует два способа уничтожить приложение в диспетчере задач.

Уничтожение через вкладку Приложения примерно эквивалентно SIGTERM (в Linux).Приложение может перехватить его и выполнить дополнительную обработку, поскольку оно в основном отправляет сообщение «закрыть окно».Сообщение для перехвата: WM_CLOSE.

Вкладка "Убить с помощью процессов" будет примерно эквивалентна SIGKILL (в Linux).Вы ничего не можете сделать, чтобы перехватить это, кроме отслеживания действий пользователя в окне списка диспетчера задач и кнопки «Завершить процесс», или наличия сторожевого процесса, который будет видеть, когда будет уничтожен первый

1 голос
/ 03 ноября 2011

В консольных приложениях вы должны рассмотреть возможность установки функции обратного вызова HandlerRoutine для перехвата CTRL_C_EVENT, CTRL_BREAK_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, CTRL_SHUTDOWN_EVENT.

В приложениях с графическим интерфейсом следует учитывать обработку WM_CLOSE , WM_QUERYENDSESSION , WM_ENDSESSION .

1 голос
/ 03 ноября 2011

Перечислить все запущенные процессы. Как только вы это сделаете, вы получите идентификаторы процессов. Получите дескриптор каждого процесса через ранее полученный идентификатор и найдите процесс, который вы ищете. Используйте тот же дескриптор процесса в отдельном потоке, например:

WaitForSingleObject (hProcess, INFINITE);

Как только процесс завершится, этот поток завершится.

...