如何处理你的Windows应用程序被强制关闭?

时间:2015-04-29 05:08:53

标签: c++ windows-applications

如果用户决定强行关闭我的应用程序(比如通过任务管理器)有没有办法在应用程序关闭之前快速执行一些清理代码?我用c ++编写btw

2 个答案:

答案 0 :(得分:1)

这取决于指示如何关闭流程。可以在优雅退出时执行此操作,但不能强行关闭任何操作。

如果通过TerminateProcessExitProcess关闭该流程,您将无法执行任何正常清理。 TerminateProcess是任务管理器和实用程序(如Sysinternals pskill)结束目标进程的方式。 ExitProcess在一个进程中被调用,但通常不用于退出。

如果进程在一个线程上有一个消息泵(通常是进程中的第一个线程),并且没有其他运行的线程正在运行其生命周期与该线程中的活动无关的代码,则WM_QUIT消息将表示进程应该关闭(在语义上,应用程序应该关闭,您的进程可能会因为其他原因而暂时停留一段时间),并且您可以在收到消息时运行清理代码。根据您的需要,您可以考虑在窗口式应用中尽早执行清除操作WM_CLOSEWM_DESTROY

如果您在DLL中编写了代码,则可以在DllMain中处理通知,这些通知将允许您执行最后机会清理(DLL_PROCESS_DETACH),这可能涵盖以下情况:没有消息泵的进程退出。但是,对于严格依赖于任何C / C ++运行时(或任何其他DLL)的代码,这不是一种很好的方法,因为运行时可能首先被卸载。

最后,对于您控制WinMainmain中运行的任何优雅关闭,您可以在任一函数返回之前执行任何需要清理的操作,然后将控制权发送回Windows子系统。对于大多数应用需求而言,这是首选且通常最安全的。

答案 1 :(得分:0)

如果您使用的是消息泵,请处理WM_QUIT消息。

另外:What is the difference between WM_QUIT, WM_CLOSE, and WM_DESTROY in a windows program?

修改

对不起,我读过你想要处理终止的事实,例如任务经理 这可能会对您有所帮助:How to catch event when Task manager kill your C++ application