正确处理 WM_ENDSESSION 的方法?
Proper way of handling WM_ENDSESSION?
在完成最终清理任务后 'quit' 应用程序的正确方法是什么,以响应 WM_ENDSESSION
message?
一旦我的应用程序(一个响应外部输入的类似服务的可执行文件)收到此消息,并且 wParam == TRUE
它会写入日志的末尾并将其刷新。在这一点之后,我实际上希望我的应用程序完全停止。我不希望 运行 有任何进一步的代码,因为清理工作将由 Windows 完成,并且我的应用程序在此消息后完成的任何服务都可能被进程终止粗鲁地中断。
我希望我的应用程序只执行绝对必要的工作量,然后停止,以免减慢 Windows 关闭速度。我能想到的一些可能性是:
- 我能想到的一个选择是调用
ExitProcess
。然而,这似乎做了很多工作,也许太多了?
- 另一种选择是在收到
WM_ENDSESSION
后设置一个标志,并在我的代码中有策略地检查这个标志,以便程序不执行任何操作。明显的缺点是这会使代码不必要地复杂化。
可能还有其他选择,我想知道:哪个是正确的方法?
有趣的读物
以下是关于该主题的一些有趣读物,但其中 none 回答了这个问题。
- What's the proper response to WM_ENDSESSION with ENDSESSION_CLOSEAPP and wParam == FALSE?
- Should I process WM_ENDSESSION, WM_QUERYENDSESSION, both or neither?
- Problem with WM_ENDSESSION message
- C++: cleanup actions in response to Windows logoff
- 旧的新事物:Once you return from the WM_ENDSESSION message, your process can be terminated at any time
- 旧的新事物:When DLL_PROCESS_DETACH tells you that the process is exiting, your best bet is just to return without doing anything
更新:
_exit() 将快速终止进程,而无需进行不必要的工作。 (不要将它与 exit() 混淆。)
有趣的是,_exit() 的实现以调用 ExitProcess 结束,因此 DLL_PROCESS_DETACH 通知仍会发送,但 运行time DLL 不会 运行 静态在这种情况下是析构函数,因为 _exit() 首先设置一个标志。
原答案:
ExitProcess 是合适的。听起来工作量很大,但其中大部分工作还是会发生,即使您的进程崩溃也是如此。
唯一重要的、不必要的工作可能是对 DLL 的 DLL_PROCESS_DETACH 通知。你能做的最好的事情就是确保你的 DLL 在收到这些通知时不会做太多工作。
另一种选择是调用 abort 或 _exit,但我怀疑它们大致等同于 ExitProcess。
我同意 Adrian 的观点,ExitProcess() 通常是最合适的选择。
但是,如果您绝对必须(例如)阻止 C++ 析构函数 运行,您总是可以求助于核选项:
TerminateProcess(GetCurrentProcess());
在完成最终清理任务后 'quit' 应用程序的正确方法是什么,以响应 WM_ENDSESSION
message?
一旦我的应用程序(一个响应外部输入的类似服务的可执行文件)收到此消息,并且 wParam == TRUE
它会写入日志的末尾并将其刷新。在这一点之后,我实际上希望我的应用程序完全停止。我不希望 运行 有任何进一步的代码,因为清理工作将由 Windows 完成,并且我的应用程序在此消息后完成的任何服务都可能被进程终止粗鲁地中断。
我希望我的应用程序只执行绝对必要的工作量,然后停止,以免减慢 Windows 关闭速度。我能想到的一些可能性是:
- 我能想到的一个选择是调用
ExitProcess
。然而,这似乎做了很多工作,也许太多了? - 另一种选择是在收到
WM_ENDSESSION
后设置一个标志,并在我的代码中有策略地检查这个标志,以便程序不执行任何操作。明显的缺点是这会使代码不必要地复杂化。
可能还有其他选择,我想知道:哪个是正确的方法?
有趣的读物
以下是关于该主题的一些有趣读物,但其中 none 回答了这个问题。
- What's the proper response to WM_ENDSESSION with ENDSESSION_CLOSEAPP and wParam == FALSE?
- Should I process WM_ENDSESSION, WM_QUERYENDSESSION, both or neither?
- Problem with WM_ENDSESSION message
- C++: cleanup actions in response to Windows logoff
- 旧的新事物:Once you return from the WM_ENDSESSION message, your process can be terminated at any time
- 旧的新事物:When DLL_PROCESS_DETACH tells you that the process is exiting, your best bet is just to return without doing anything
更新:
_exit() 将快速终止进程,而无需进行不必要的工作。 (不要将它与 exit() 混淆。)
有趣的是,_exit() 的实现以调用 ExitProcess 结束,因此 DLL_PROCESS_DETACH 通知仍会发送,但 运行time DLL 不会 运行 静态在这种情况下是析构函数,因为 _exit() 首先设置一个标志。
原答案:
ExitProcess 是合适的。听起来工作量很大,但其中大部分工作还是会发生,即使您的进程崩溃也是如此。
唯一重要的、不必要的工作可能是对 DLL 的 DLL_PROCESS_DETACH 通知。你能做的最好的事情就是确保你的 DLL 在收到这些通知时不会做太多工作。
另一种选择是调用 abort 或 _exit,但我怀疑它们大致等同于 ExitProcess。
我同意 Adrian 的观点,ExitProcess() 通常是最合适的选择。
但是,如果您绝对必须(例如)阻止 C++ 析构函数 运行,您总是可以求助于核选项:
TerminateProcess(GetCurrentProcess());