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