MFC用户界面自动关闭

MFC用户界面自动关闭,mfc,ui-automation,Mfc,Ui Automation,如果任何UI自动化客户端处于活动状态(如Inspect.Windows Eyes、UI Spy等),我们的MFC应用程序将在关机期间挂起 原因是如果存在任何Ole对象,BOOL AFXAPI AfxOleCanExitApp()将返回false。然后应用程序进入隐藏服务器模式 我曾看到过类似的帖子处理文档对象。一般的解决方案是将对象计数设置为0,正常关闭,然后在主帧的OnClose中将计数设置回原来的值。 这是一个糟糕的UI自动化解决方案。它会导致内存泄漏和客户端应用程序中的无效对象(一段时间后

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

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


有没有人见过一种正确的方法来告诉用户界面客户端此服务器将离开并释放所有对象?

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

  • 您与对象之间有连接。如果你剪掉它们,什么是优雅的?可以对每个对象使用CoDisconnectObject。但在终止应用程序时没有区别。此外,使用此功能不会减少对象锁定计数!但是,您可以删除该对象,而不会因为其他COM客户端的访问而导致崩溃
  • draw-back:CoDisconnectObject仅适用于外部链接。如果对象中有内部COM指针,则它们不受影响。所以那些可能仍然使用你的对象
  • 当你真的找到每一个有外部连接的对象时,你可以摧毁它。如果您没有内部COM指针,您可以删除您的对象,即使使用计数=0但在很多情况下,我有其他相关的COM对象链接
  • 优雅终止的唯一好方法是首先停止所有将应用程序用作服务器的应用程序!完成后退出…;)


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

    只是确认我也随机经历过这种行为。我在这里找到了Microsoft官方对此问题的答案。。。他们的解决方案是取消锁定机制。我看不出这是如何解决根本问题的。谢谢xMRi。恐怕情况就是这样。这些对象隐藏在MFC UI自动化基础设施中。我找到了它们的创建位置,但comptr没有添加到任何列表中。IAccessible接口定义了诸如EVENT_OBJECT_DESTROY之类的事件,但是我在MFC源代码中找不到它的使用实例。UI自动化不是正常的COM场景。通常,您有一台服务器,多个客户端使用它。在这里,我们有一个客户端,它使用在整个计算机使用过程中必须运行的每个应用程序。微软一定考虑到了这一点,对吗?