我做了一个COM exe服务器程序,在COM对象没有完全释放(客户还拥有对象的接口指针)时。我强行退出程序。弹出一个内存访问错误(无法写入)的对话框。单步跟踪发现是最后程序结束时CoRevokeClassObject和CoUninitialize的问题。如果客户将COM对象全部释放则不回出现这个错误。有谁碰到过这个问题吗,如何解决? 谢谢!

解决方案 »

  1.   

    对啊,程序退出之前要全部释放COM对象
      

  2.   

    不,不是这两个函数的问题,而是先前的操作不正确引起的,因为这两个函数于客户端的引用无关.CoRevokeClassObject是从COM库中移除Class Object,不过要先调用CoRevokeClassObject再调用CoUninitialize
      

  3.   

    我的次序是先调用CoRevokeClassObject再调用CoUninitialize。这个问题就出现在客户是否有连接上。
      

  4.   

    请问楼上问题是否解决呢??
    我在作一个com的exe程序时也碰到这个问题,我开始是用C++作的这个com的exe,调试程序没有问题的,后来我把这个程序用到MFC中来却出现这个问题,我用vc带的那个OLE/COM的小工具查到我的那个组建,然后创建一个实例,这个组建能够运行起来,可当我直接关闭这个组建程序的话,就出现异常,说读内存出现错误,后来我单步调试组建程序,发现就是在CoRevokeClassObject处出现一个异常,然后在调用CoUninitialize处出现异常并且中断,弄得我百思不得其解,怎莫调用这两个函数会出现错误呢???在C++中调试这个程序是没有问题的,这个是不是应为mfc的处理机制有什么特殊的地方??是不是在MFC中非得用它提供的类厂类来注册类厂呀??请高手给予回答????
      

  5.   

    是不是得用mfc提供的Ioleobjectfacotroy类来注册,而取代了CoRevokeClassObject和CoRegisterClassObject这两个api函数??这个问题太怪了,CoRevokeClassObject和CoUninitialize 本身没有什么特殊的地方呀?特别是在调用CoUninitialize 时竟然使程序中断不能再执行下去了,如果把这两个函数去掉的话就没有问题了,但这肯定是不对的呀??问一下,在MFC中,我好象只看到调用afxoleinitial,但好象没有看到结束时调用相应的释放COM库的函数呀???
      

  6.   

    在你强制关闭时判断并全部释放COM对象,或者使用智能指针也行!
      

  7.   

    想问一下,出现这个问题到底是什么原因呢????
    在MFC的自动化实现中,我好象只看到调用afxoleinitial,但好象没有看到结束时调用相应的释放COM库的函数呀???