如何通过API退出Win32应用程序?

时间:2011-08-30 17:55:11

标签: c++ winapi

我有一个使用Win32 API编写的C ++ Win32应用程序,我希望强制它退出其中一个函数。是否有像Exit()Destroy()Abort()类似的东西会终止它?

7 个答案:

答案 0 :(得分:34)

Aiiieeeeeeeeeeee。不要做任何这些事情!

  • exit()和ExitProcess相当于拿枪和射击过程。我希望我不必解释为什么这不好,特别是对于持有共享对象(如可能是系统范围的数据库句柄)的进程。我知道这是Android的常态,但这是Windows,我们不会在这里做到这一点。

  • 直接调用PostQuitMessage()会导致内存泄漏。 PostQuitMessage()旨在从WM_DESTROY调用。 这不是用于要求窗口关闭的消息。它是应用程序将退出代码发布回shell的回调机制。它旨在使用应用程序退出代码填充WM_QUIT。如果直接调用PostQuitMessage(),则完全绕过WM_DESTROY。这是有问题的,因为许多窗口 - 和子窗口小部件 - 非常正确perform their clean-up in WM_DESTROY.如果您通过躺在窗口中跳过此消息,您将拒绝组件清理的机会。

  • 由于我们正在谈论这个主题,也不要直接调用WM_DESTROY。微软的Raymond Chen有一篇很棒的文章,他解释了 "Sending a window a WM_DESTROY message is like prank calling somebody pretending to be the police". < / em>这是PostQuitMessage的邪恶双胞胎。而不是在没有清理的情况下退出,而是要求窗户清理而不退出。窗口管理器永远不会知道删除组件,并且在内存中留下了一个死的孤儿窗口。叹。

正确的答案是发布WM_CLOSE。使用默认窗口过程的任何内容都会正确地通知窗口管理器销毁窗口,窗口将级联到WM_DESTROY然后按预期级联到WM_QUIT。

如果你需要不同于标准关闭的行为,另一种选择是创建一个WM_USER或WM_APP消息。如果你的窗口有一个“花哨的”WM_CLOSE - 例如,你说用户提示“你确定要退出吗?” - 并且你想跳过它,你可以用WM_USER或WM_APP定义一个自定义消息并在其位置调用它。您的应用程序定义的消息将实现默认的关闭行为,并且与系统小工具相关联的WM_CLOSE会执行您的奇特行为。

我希望有所帮助!

答案 1 :(得分:11)

PostQuitMessage()是退出窗口应用程序的标准,优雅方式。

它不会立即退出,而是发布一个将由主循环解析的退出消息(如果正确完成),然后退出应用程序。

答案 2 :(得分:4)

如果您正在使用具有正确窗口过程的Win32应用程序,则可以使用PostQuitMessage函数。

答案 3 :(得分:2)

如果您正在使用visual C ++,请使用:

答案 4 :(得分:2)

WinMain函数返回。如果您有消息循环,请使用PostQuitMessage突破。不要试图在执行过程中退出进程;它很草率。

答案 5 :(得分:1)

ExitProcess是要使用的函数,否则你可以使用exit,注意既不能确保关闭的完整性(即:你有很多泄漏句柄等,并且线程操作将被终止,即使它们是一个操作的中途,就像数据库提交一样)

答案 6 :(得分:1)