我编写一个多层结构的程序,在中间件COM使用的Apartment Model线程模式,客户端通过主线程的数据模块访问COM。现在我想客户端另开一个线程但不另建数据模块,为了实现这个功能。参考《Win2000编程技术内幕》中关于COM住所建调度的方法使用CoMarshallnterThreadInterfaceInStream函数,可是调用它总是返回E_NOINTERFACE。请教各位大虾这是怎么回事?我该如何实现这一功能?我使用的是TSocketConnection和中间件联接。

解决方案 »

  1.   

    SOCKETCONNECTION没有试过,不过DCOMCONNECTION肯定可以。
    也许你的做法有误。基本上是这样:
    在主线程中将Connection OPEN开,然后调用CoMarshallInterThreadInterfaceInStream对IAppServer(用GetServer或把AppServer属性转为IDispatch再转为你的RDM接口--Ixxxrdm)进行Marshall,其中IStream参数为线程的局部变量。
    然后在线程的Execute中用CoUnmarshalInterface(注意不要用CoGetInterfaceAndReleaseStream,因为DELPHI会自动释放IStream,所以会出错)解出接口,然后就可以在线程里用这个Ixxxrdm接口了,不过这样的话,你要在线程中用ClientDataset就会比较麻烦,因为只能自己去调用AS_xxx那几个方法了。
      

  2.   

    在SOCKETCONNECTION中调用就出错,受不了。我现在直接开一个线程去访问Com,其它程序想要访问数据模块,就直接和线程通讯。谢谢Raptor,谁还有更好的方法吗?一会结帖。