MFC UI自动化优雅关闭

时间:2014-01-30 16:39:22

标签: mfc ui-automation

如果任何UI自动化客户端处于活动状态,我们的MFC应用程序会在关机期间挂起(例如Inspect.Windows Eyes,UI Spy等) 原因是BOOL AFXAPI AfxOleCanExitApp()如果存在任何Ole对象则返回false。然后该应用程序进入隐藏服务器模式。

我见过处理Document对象的类似帖子。一般解决方案是将对象计数设置为0,正常关闭然后在主框架的OnClose中设置计数。 这对UI自动化来说是一个糟糕的解决方案它导致客户端应用程序中的内存泄漏和无效对象(检查实际上在一段时间后崩溃)。

有没有人看到告诉UI客户端这个服务器正在消失并释放所有对象的正确方法?

1 个答案:

答案 0 :(得分:0)

关闭优雅没有真正好的方法。没有优雅的方法可以在任何服务器仍在使用时停止它。你只能进行必要的清理。

  1. 您有与对象的连接。如果切断它们,优雅是什么?您可以为每个对象使用CoDisconnectObject。但是,当您终止申请时没有区别。使用此功能也不会减少对象锁定计数!但是,您可以删除该对象,而不会因其他COM客户端的访问而崩溃。
  2. 缺点:CoDisconnectObject仅适用于外部链接。如果你有对象的内部COM指针,它们不会受到影响。所以那些人仍然可以使用你的对象......
  3. 当您真正找到具有外部连接的每个对象时,您可以销毁它。如果没有内部COM指针,即使使用次数也可以删除对象!= 0。但在很多情况下,我有其他依赖的COM对象链接...
  4. 优雅终止的唯一真正好方法是首先停止将您的应用程序用作服务器的所有应用程序!完成此操作后退出...;)

    所以如果你想强制关机。断开你的能力。免费获得尽可能多的资源。忽略应用程序锁定计数并退出。即使调试版本报告泄漏,也会释放内存。有问题的只是其他资源(文件,互斥体,系统对象......)在关闭应用程序时可能需要更好的处理......