退出'的正确方法是什么?完成最终清理任务后的应用程序,以响应WM_ENDSESSION
message?
一旦我的应用程序(响应外部输入的类似服务的可执行文件)收到此消息,wParam == TRUE
它会写入日志的结尾并将其刷新。在此之后,我实际上希望我的应用程序完全停止。我不希望任何进一步的代码运行,因为在此消息可能被进程终止粗略中断后,Windows将完成清理以及我的应用程序完成的任何服务。
我希望我的应用程序只执行绝对必要的工作量,然后停止以便不会减慢Windows关闭速度。我能想到的一些可能性是:
ExitProcess
。但是,这似乎做了很多工作,也许太多了?WM_ENDSESSION
后设置一个标志,并在我的代码中策略性地放置对该标志的检查,以便程序不执行任何操作。明显的缺点是这会不必要地使代码复杂化。可能还有其他选择,我想知道:哪种方式正确?
以下是关于这个主题的一些有趣的读物,但这些都没有回答这个问题。
答案 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());