代码暂时就不贴了,因为太大了,不过有个百分之百复现的现象。希望能得到高人指点一二。(注:本人对COM还不十分了解)情况是这样:写了一个com,该com里又用ado写了一个数据库操作。仅有几个接口:打开数据库,关闭数据库,查询,执行sql语句。有两个进程用到了这个com。单个进程com的初始化到回收,访问数据库都没有问题,都是正常的。两个进程的com均未回收前,访问数据库都是正常的。但若先是两个进程初始化了com,之后,一个进程先回收了com。另一个进程访问数据库就出现了异常,抛出的异常用catch(_com_error e)捕获不到。
目前,我知道原因的,用catch(_com_error e)捕获不到的异常。就一个:就是线程不同步,在com回收之后还在执行com中的接口中的代码。但是,上面的情况是两个进程间,并各自引用了com。一个进程回收了com,怎么会影响到另一个进程的访问。实在是令我不解。急迫希望高手来救火。

解决方案 »

  1.   

    你的COM Object是不是singleton的?
      

  2.   

    你创建的是进程内组件还是进程外组件了?进程内组件应该是没问题的。不知道调用ADO的时候是不是一定要CoInitialize方法了,你试下
      

  3.   

    为什么要这么操作
    如果这样的话应该是你的com聚合ado
    否则可能会出问题
    主要是多进程操作时引用计数的控制
      

  4.   

    去了解下组件的调用原理,CoCreateInstance,CoGetClassObject,CreateInstance等
      

  5.   

    谢谢各位!COM Object是不是singleton,老实说,我并不明白这个意思。com中放入了ado,我之前就额外又加了一个CoInitializeEx(NULL, COINIT_MULTITHREADED); 结果还不如不加。引用计数的控制,我还是有信心控制好了的。
    这个com用atl写的,所有进程的com初始化是用CoInitializeEx(NULL, COINIT_MULTITHREADED)。另外,我反复看了下,我想我忘说了一个很重要的情况,我说的两个进程都是windows服务程序。另外,我这还有个应用程序调用这个com接口,发现应用程序的访问、关闭打开都是很正常的,停止windows服务程序也不会影响应用程序使用com。所以,我总感觉之所以出错,和服务程序有着什么关系。
    服务程序调用com接口要注意哪些了?或者有着什么必须遵守的事。
    ps:上午,我尝试在我服务的析构函数中调用com接口,竟然发现调用不起来,就像是com提前回收了一样。
      

  6.   

    这样说明你的ADO是共享一组内存的假如不共享了就要考虑到冲突问题,改一下,用指针,都MALLOC一段内存试试看。。
      

  7.   


    不是很明白,ado也是com组件,我用的是智能指针,在创建连接指针和记录集指针的实例之后(CreateInstance,这个函数就调用了QueryInterface方法把),都进行了pSqlTable.AddRef(); m_pConnection.AddRef();增加智能指针的自身的引用计数。但是这样还是出错。去掉m_pConnection.AddRef();单个服务执行正常,去掉pSqlTable.AddRef();,连记录都取不到。
      

  8.   

    在同事的帮助下,酷似是解决了。同事谢谢各位的好心帮助。我将com,原本是exe的,改成了dll。改了下com的初始化,并且改成了进程内组件,目前还没发现什么问题。也就是这段代码:
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    CoCreateInstance(CLSID_PnsDBEntryEx, NULL, CLSCTX_INPROC_SERVER,
      IID_IPnsDBEntryEx, (void **)&g_pDataBase);
    好,结贴给分。