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

19

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


1
你需要有多大的强制力? - Rob Kennedy
2
好的,就在那里停下来,不再继续了。 - bodacydo
7个回答

50

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则执行您的花哨行为。

希望这可以帮助您!


13

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

它不会立即退出,而是会发送一个退出消息,该消息将被主循环(如果正确执行)解析,然后退出应用程序。


4

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


3
如果您正在使用Visual C++,那么请使用: 该函数可以帮助您退出应用程序。

2

ExitProcess是要使用的函数,否则可以使用exit,请注意,这两个函数都不能保证关闭的完整性(例如:您可能会泄漏句柄等,线程操作将被终止,即使它们正在进行中,例如数据库提交)。


2

std::exit是唯一对我有效的方法,我是从一个线程中调用它的。 - Wolfgang Schulz

2

WinMain函数返回。如果您有消息循环,请使用PostQuitMessage来中断它。不要试图在执行过程中退出进程,这样做很粗糙。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接