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

bod*_*ydo 16 c++ winapi

我有一个使用Win32 API编写的C++ Win32应用程序,我希望强制它退出其中一个函数.有什么样Exit()Destroy()Abort()类似的东西,将刚刚结束了吗?

lis*_*isa 34

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会执行您的奇特行为.

我希望有所帮助!


Coi*_*oin 11

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

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


Nec*_*lis 2

ExitProcess是要使用的函数,否则您可以使用exit,请注意,两者都不能确保关闭的完整性(即:您的许多泄漏句柄等和线程操作将被终止,即使它们是在操作的中途,例如数据库提交)