用DECLARE_CLASSFACTORY_SINGLETON宏的话可以共享简单对象,但是我做了一个经常外的COM组件,想给所有的调用者共享同一个连接实例(类似自己实现连接池),结果发现共享出去的接口虽然状态什么的都正确,但是不能执行sql语句打开数据集,查了msdn说要用列集,结果我用CoMarshalInterface列集_Connection接口后,然后GetHGlobalFromStream得到一个HGLOBAL内存句柄返回给客户调用组件后,CoUnmarshalInterface报磁盘读写错误。请问我哪儿用错了?donbox的书里不是说可以把HGLOBAL那块内存传往任意的套间使用吗?

解决方案 »

  1.   

    把提供ADO连接的功能写进一个COM服务里,并以一个COM接口暴露ADO连接,其它应用程序创建该COM服务的实例,取那个COM接口就可以了。说来有点绕口,大致思路是这样的,当然,肯定还有别的更好的思路。
      

  2.   

    HGLOBAL是可以任意使用,但局限于同一个进程内的不同线程。
    最简单的做法,是传递IDispatch*,组件从_Connection查询出IDispatch*用于返回参数,客户端从IDispatch*查询出_Connection
      

  3.   

    统一由一个com server等来访问数据库,而你的其他多个进程都来访问这个com server等来调用它内部的数据库操作功能
      

  4.   


    呵呵,我最先就是这么做的,我说了从返回的IDispatch获得Connection后,查询连接状态什么的都是正确的,但是就是不能执行sql获得RecordSet,在Open的时候提示什么参数不正确或错误什么的,后来在网上查好像本来接口跨进程就要列集
      

  5.   

    Q248287里面有这么一段话,是否就意味着我想跨进程传递连接的想法泡汤了呢?:(One key pitfall is that ADO does not allow you to pass a connection pointer across process boundaries and then attach that to an ADO recordset object that was created in a different process space. Recordsets and their associated connections must be created in the same process space. 
      

  6.   

    我估计跨进程实现起来非常麻烦,因为进程的地址是私有的,即使取得了远程内存指针,仍无法在本地重构此对象(如果不是对象,而是数据域,如变量和结构倒很好可以实现),因此,建议用两种办法来代替,一是将连接和查询交由一个COM服务器,由COM服务器统一处理,其它进程通过COM服务器的接口进行访问,二是干脆不用多进程,而使用多线程。
      

  7.   

    这段英文的意思是,你在其它进程创建的Connection不能Attach到本进程创建的Recordset对象。这并不表示你不能跨进程使用记录集,其实方法跟传递Connection一样,在组件进程中创建Recordset然后传递出来。
      

  8.   


    呵呵,如果数据集跨进程共享用处不大,其实它后面说了用adUserClient传递离线RecordSet也可以,不过这与我期望的仅跨进程共享连接相差太远了!我现在只是期望,有没有曲径可以让我跨进程共享_Connection对象而已:)