代码暂时就不贴了,因为太大了,不过有个百分之百复现的现象。希望能得到高人指点一二。(注:本人对COM还不十分了解)情况是这样:写了一个com,该com里又用ado写了一个数据库操作。仅有几个接口:打开数据库,关闭数据库,查询,执行sql语句。有两个进程用到了这个com。单个进程com的初始化到回收,访问数据库都没有问题,都是正常的。两个进程的com均未回收前,访问数据库都是正常的。但若先是两个进程初始化了com,之后,一个进程先回收了com。另一个进程访问数据库就出现了异常,抛出的异常用catch(_com_error e)捕获不到。
目前,我知道原因的,用catch(_com_error e)捕获不到的异常。就一个:就是线程不同步,在com回收之后还在执行com中的接口中的代码。但是,上面的情况是两个进程间,并各自引用了com。一个进程回收了com,怎么会影响到另一个进程的访问。实在是令我不解。急迫希望高手来救火。
目前,我知道原因的,用catch(_com_error e)捕获不到的异常。就一个:就是线程不同步,在com回收之后还在执行com中的接口中的代码。但是,上面的情况是两个进程间,并各自引用了com。一个进程回收了com,怎么会影响到另一个进程的访问。实在是令我不解。急迫希望高手来救火。
如果这样的话应该是你的com聚合ado
否则可能会出问题
主要是多进程操作时引用计数的控制
这个com用atl写的,所有进程的com初始化是用CoInitializeEx(NULL, COINIT_MULTITHREADED)。另外,我反复看了下,我想我忘说了一个很重要的情况,我说的两个进程都是windows服务程序。另外,我这还有个应用程序调用这个com接口,发现应用程序的访问、关闭打开都是很正常的,停止windows服务程序也不会影响应用程序使用com。所以,我总感觉之所以出错,和服务程序有着什么关系。
服务程序调用com接口要注意哪些了?或者有着什么必须遵守的事。
ps:上午,我尝试在我服务的析构函数中调用com接口,竟然发现调用不起来,就像是com提前回收了一样。
不是很明白,ado也是com组件,我用的是智能指针,在创建连接指针和记录集指针的实例之后(CreateInstance,这个函数就调用了QueryInterface方法把),都进行了pSqlTable.AddRef(); m_pConnection.AddRef();增加智能指针的自身的引用计数。但是这样还是出错。去掉m_pConnection.AddRef();单个服务执行正常,去掉pSqlTable.AddRef();,连记录都取不到。
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
CoCreateInstance(CLSID_PnsDBEntryEx, NULL, CLSCTX_INPROC_SERVER,
IID_IPnsDBEntryEx, (void **)&g_pDataBase);
好,结贴给分。