我有一个使用 Win32 API 编写的 C++ Win32 应用程序,我希望强制它在其中一个函数中退出。有没有类似的东西Exit()
or Destroy()
or Abort()
类似的东西会终止它吗?
哎呀呀呀呀呀呀。不要做任何这些事情!
exit() 和 ExitProcess 相当于拿把枪朝进程的脸射击。我希望我不必解释为什么这不好,特别是对于保存共享对象(例如可能是系统范围的数据库句柄)的进程。我知道这是 Android 中的常态,但这是 Windows,我们在这里不这样做。
直接调用PostQuitMessage()可能会导致内存泄漏。PostQuitMessage() 旨在从 WM_DESTROY 调用。它不是一条旨在用于要求关闭窗口的消息。它是应用程序将其退出代码发布回 shell 的回调机制。它的目的是用应用程序退出代码填充 WM_QUIT。如果你直接调用PostQuitMessage(),你将完全绕过WM_DESTROY。这是有问题的,因为许多窗口和子窗口部件都非常正确在 WM_DESTROY 中执行清理工作。 http://blogs.msdn.com/b/oldnewthing/archive/2005/07/26/443384.aspx如果您通过向窗口撒谎来跳过此消息,您将拒绝组件进行清理的机会。
既然我们谈到了这个话题,也不要直接调用 WM_DESTROY。Microsoft 的 Raymond Chen 有一篇精彩的文章,他在其中解释了“向窗口发送 WM_DESTROY 消息就像恶作剧地打电话给冒充警察的人”。 http://blogs.msdn.com/b/oldnewthing/archive/2011/09/26/10216420.aspx它有点像 PostQuitMessage 的邪恶双胞胎。您不是在不进行清理的情况下退出,而是要求窗口在不退出的情况下进行清理。窗口管理器永远不知道要删除组件,并且内存中会留下一个死的孤立窗口。叹。
正确的答案是发布WM_CLOSE。使用默认窗口过程的任何内容都将正确通知窗口管理器销毁窗口,该窗口将按预期级联到 WM_DESTROY,然后级联到 WM_QUIT。
如果您需要与标准关闭不同的行为,另一种选择是创建 WM_USER 或 WM_APP 消息。如果您的窗口有一个“奇特的”WM_CLOSE——例如,您给用户一个提示“您确定要退出吗?”——并且您想跳过它,您可以使用 WM_USER 或定义一条自定义消息WM_APP 并在其位置调用它。您的应用程序定义的消息将实现默认的关闭行为,并且与系统小工具绑定的 WM_CLOSE 执行您的奇特行为。
我希望这有帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)