我有一个使用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会执行您的奇特行为.
我希望有所帮助!
ExitProcess是要使用的函数,否则您可以使用exit,请注意,两者都不能确保关闭的完整性(即:您的许多泄漏句柄等和线程操作将被终止,即使它们是在操作的中途,例如数据库提交)
| 归档时间: |
|
| 查看次数: |
20379 次 |
| 最近记录: |