处理WM_ENDSESSION的正确方法?

时间:2015-10-16 15:42:11

标签: c++ windows winapi windows-messages

退出'的正确方法是什么?完成最终清理任务后的应用程序,以响应WM_ENDSESSION message

一旦我的应用程序(响应外部输入的类似服务的可执行文件)收到此消息,wParam == TRUE它会写入日志的结尾并将其刷新。在此之后,我实际上希望我的应用程序完全停止。我不希望任何进一步的代码运行,因为在此消息可能被进程终止粗略中断后,Windows将完成清理以及我的应用程序完成的任何服务。

我希望我的应用程序只执行绝对必要的工作量,然后停止以便不会减慢Windows关闭速度。我能想到的一些可能性是:

  • 我能想到的一个选择是致电ExitProcess。但是,这似乎做了很多工作,也许太多了?
  • 另一种选择是在收到WM_ENDSESSION后设置一个标志,并在我的代码中策略性地放置对该标志的检查,以便程序不执行任何操作。明显的缺点是这会不必要地使代码复杂化。

可能还有其他选择,我想知道:哪种方式正确?

有趣的读物

以下是关于这个主题的一些有趣的读物,但这些都没有回答这个问题。

2 个答案:

答案 0 :(得分:2)

更新

_exit()将在没有不必要的工作的情况下快速终止进程。 (不要把它与exit()混淆。)

有趣的是,_exit()的实现以对ExitProcess的调用结束,因此DLL_PROCESS_DETACH通知仍然被发送,但运行时DLL在这种情况下不会运行静态析构函数,因为_exit()首先设置了一个标志。

原始答案:

ExitProcess是合适的。这可能听起来像很多工作,但无论如何,即使您的流程崩溃,其中很多都会发生。

唯一重要的,不必要的工作可能是DLL的DLL_PROCESS_DETACH通知。您可以做的最好的事情是确保您的DLL在收到这些通知时不会做太多工作。

另一种选择是调用abort或_exit,但我怀疑它们大致等同于ExitProcess。

答案 1 :(得分:1)

我同意Adrian的观点,即ExitProcess()通常是最合适的选择。

但是,如果你绝对必须(例如)阻止C ++析构函数运行,你总是可以使用核选项:

TerminateProcess(GetCurrentProcess());