偶想实现象WORD之类带界面的COM应用程序,有个主COM组件(偶是用CComObjectGlobal),现在可以通过CoCreateInstance创建该COM组件来启动应用程序,想在客户使用完释放接口指针来使得该应用程序退出,但老是出问题。
原因(带流程):
在客户释放接口指针——》CComObjectGlobal.Release——》_Module.Unlock——》AfxOleUnlockApp——》AfxOleOnReleaseAllObjects,此时通过AfxGetApp得到的CWinApp对象的m_pMainWnd指向的是无效窗口类,导致m_pMainWnd->DestroyWindow出现异常。
但是通过比较发现AfxGetApp得到的线程还是原来的主线程(m_nThreadID相同),它的m_pMainWnd虽然是无效类,但它拥有的m_hWnd也是原来的主窗口句柄。不知道如何解释和处理?还望哪位作过同样事情的高手指教。

解决方案 »

  1.   

    说的不太清楚
    AfxGetApp前加上这句看看
    AFX_MANAGE_STATE(AfxGetAppModuleState());
      

  2.   

    你在调用m_pMainWnd->DestroyWindow之前窗口已经被消毁了,窗口句柄已无效。检查一下是在什么地方将窗口消毁的,而此时m_pMainWnd对象竞然不知道。实在不行,将m_pMainWnd的OnDestroyWindow重载了,不去调用基类的DestroyWindow,但这样不太好。治标不治本。
      

  3.   

    可能还没有说清楚。偶的组件程序是拥有界面的,即使是通过CoCreateInstance来启动的话也是出现界面的,所以是允许用户强行退出的,即使还有组件引用也可以的。现在是想允许当CoCreateInstance启动组件程序时组件的使用结束释放完指针后该组件程序应该自动退出了,但是却出上面描述的问题。更奇怪的是,当DestroyWindow出现异常后如果是忽略掉。然后用户通过菜单来退出程序,这下就可以退出了,此时检查主线程也是创建的主线程,它所拥有的m_pMainWnd拥有的m_hWnd也是原来的主窗口句柄,但此时m_pMainWnd却是个有效窗口类!!!