Если пользователь решает принудительно закрыть мое приложение (например, через диспетчер задач), есть ли способ, которым я могу быстро выполнить некоторый код очистки перед закрытием приложения? я кодирую в с ++ кстати
Это зависит от того, как процесс проинструктирован для закрытия. Это можно сделать при изящном выходе, но не для чего-либо принудительно закрытого.
Если процесс закрыт через TerminateProcess
или же ExitProcess
, Вы не сможете выполнить изящную очистку. TerminateProcess
Вот как диспетчер задач и такие утилиты, как Sysinternals pskill завершают целевой процесс. ExitProcess
вызывается внутри процесса, но обычно не используется для выхода.
Если у процесса есть насос сообщений в одном потоке (обычно это первый поток в процессе) и нет других запущенных потоков, на которых выполняется код, время жизни которого не зависит от активности в этом потоке, тогда WM_QUIT
сообщение будет сигнализировать о том, что процесс должен быть закрыт (семантически, что приложение должно закрыться, ваш процесс может остаться на некоторое время по другим причинам), и вы можете запустить код очистки после получения сообщения. В зависимости от ваших потребностей, в оконном приложении вы можете рассмотреть возможность выполнения операций очистки уже WM_CLOSE
или же WM_DESTROY
.
Если вы написали код в DLL, есть уведомления, которые вы можете обработать в DllMain
что позволит вам выполнить последнюю очистку (DLL_PROCESS_DETACH
), что потенциально может охватывать случай выхода из процесса без прокачки сообщения. Однако это не отличный способ выполнить очистку для кода, который строго зависит от любой среды выполнения C / C ++ (или любой другой DLL), поскольку среда выполнения может быть выгружена первой.
Наконец, для любого грациозного закрытия, где вы контролируете, что происходит в WinMain
или же main
, вы всегда можете выполнить любую необходимую очистку, прежде чем любая из функций вернется, отправив управление обратно в подсистему Windows. Это является предпочтительным и обычно наиболее безопасным для большинства потребностей приложений.
Если вы используете насос сообщений, обработайте WM_QUIT
сообщение.
Также: В чем разница между WM_QUIT, WM_CLOSE и WM_DESTROY в программе для Windows?
РЕДАКТИРОВАТЬ
Извините, я прочитал о том, что вы хотите обработать завершение, например, с помощью диспетчера задач.
Это может помочь вам, хотя: Как поймать событие, когда диспетчер задач убивает ваше приложение C ++