我有一个使用Win32 API编写的C++ Win32应用程序,我希望在其中一个函数中强制退出它。是否有像Exit()
、Destroy()
或Abort()
这样的东西,可以直接终止它?
Aiiieeeeeeeeeeee. 不要做以下任何一件事情!
exit() 和 ExitProcess 相当于把枪口对准进程脸上扣动扳机。 我希望我不必解释为什么这很不好,特别是对于那些持有共享对象例如系统级数据库句柄的进程而言。我知道在 Android 中这是标准做法,但这里是 Windows,我们不这样做。
直接调用 PostQuitMessage() 可能会引起内存泄漏。 PostQuitMessage() 应该从 WM_DESTROY 调用。 它绝不应该被用来请求一个窗口关闭。它是让应用程序将其退出码回传给 shell 的回调机制。 它旨在将应用程序退出码填充到 WM_QUIT 中。如果您直接调用 PostQuitMessage(),则将完全跳过 WM_DESTROY。这是有问题的,因为许多窗口 - 以及子小部件 - 非常正确地进行其清理工作是在 WM_DESTROY 中完成的。如果您通过欺骗窗口跳过此消息,您将拒绝组件清理的机会。
既然我们正在谈论这个问题,也不要直接调用 WM_DESTROY。 微软的 Raymond Chen 在一篇精彩的文章中解释了“向窗口发送 WM_DESTROY 消息就像是假扮警察去恶作剧电话”。它有点像 PostQuitMessage 的邪恶孪生兄弟。您并非无法清理便退出,而是要求窗口在不退出情况下进行清理。窗口管理器从未知道要移除的组件,留下一个死亡的孤儿窗口在内存中。叹气。
正确答案是发布 WM_CLOSE。 任何使用默认窗口过程的东西都将正确通知窗口管理器销毁窗口,这将按照预期级联到 WM_DESTROY 然后到 WM_QUIT。
如果您需要不同于标准关闭的行为,另一种选择是创建WM_USER或WM_APP消息。如果您的窗口有一个 “花哨” 的 WM_CLOSE,在这种情况下,例如,您给用户一个提示“你确定要退出吗?”并且您想跳过它,您可以定义一个自定义消息,使用WM_USER或WM_APP并调用该消息。您的应用程序定义的消息将实现默认的关闭行为,而与系统小部件相关联的WM_CLOSE则执行您的花哨行为。希望这可以帮助您!
PostQuitMessage()
是标准的、优雅的退出窗口应用程序的方式。
它不会立即退出,而是会发送一个退出消息,该消息将被主循环(如果正确执行)解析,然后退出应用程序。
ExitProcess
是要使用的函数,否则可以使用exit
,请注意,这两个函数都不能保证关闭的完整性(例如:您可能会泄漏句柄等,线程操作将被终止,即使它们正在进行中,例如数据库提交)。
从WinMain
函数返回。如果您有消息循环,请使用PostQuitMessage
来中断它。不要试图在执行过程中退出进程,这样做很粗糙。