Как обращаться с приложением Windows, будучи принудительно закрытым?

Если пользователь решает принудительно закрыть мое приложение (например, через диспетчер задач), есть ли способ, которым я могу быстро выполнить некоторый код очистки перед закрытием приложения? я кодирую в с ++ кстати

0

Решение

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

Если процесс закрыт через TerminateProcess или же ExitProcess, Вы не сможете выполнить изящную очистку. TerminateProcess Вот как диспетчер задач и такие утилиты, как Sysinternals pskill завершают целевой процесс. ExitProcess вызывается внутри процесса, но обычно не используется для выхода.

Если у процесса есть насос сообщений в одном потоке (обычно это первый поток в процессе) и нет других запущенных потоков, на которых выполняется код, время жизни которого не зависит от активности в этом потоке, тогда WM_QUIT сообщение будет сигнализировать о том, что процесс должен быть закрыт (семантически, что приложение должно закрыться, ваш процесс может остаться на некоторое время по другим причинам), и вы можете запустить код очистки после получения сообщения. В зависимости от ваших потребностей, в оконном приложении вы можете рассмотреть возможность выполнения операций очистки уже WM_CLOSE или же WM_DESTROY.

Если вы написали код в DLL, есть уведомления, которые вы можете обработать в DllMain что позволит вам выполнить последнюю очистку (DLL_PROCESS_DETACH), что потенциально может охватывать случай выхода из процесса без прокачки сообщения. Однако это не отличный способ выполнить очистку для кода, который строго зависит от любой среды выполнения C / C ++ (или любой другой DLL), поскольку среда выполнения может быть выгружена первой.

Наконец, для любого грациозного закрытия, где вы контролируете, что происходит в WinMain или же main, вы всегда можете выполнить любую необходимую очистку, прежде чем любая из функций вернется, отправив управление обратно в подсистему Windows. Это является предпочтительным и обычно наиболее безопасным для большинства потребностей приложений.

1

Другие решения

Если вы используете насос сообщений, обработайте WM_QUIT сообщение.

Также: В чем разница между WM_QUIT, WM_CLOSE и WM_DESTROY в программе для Windows?

РЕДАКТИРОВАТЬ

Извините, я прочитал о том, что вы хотите обработать завершение, например, с помощью диспетчера задач.
Это может помочь вам, хотя: Как поймать событие, когда диспетчер задач убивает ваше приложение C ++

0

По вопросам рекламы [email protected]