假设有COM+服务器A,客户端机器B。在A上的COM+应用提供两个接口IA和IB,因为IB的实现要用到IA,IB有一个方法要求将IA作为输入参数。
客户端进程先获得了IA,然后获得IB。这时客户端拥有的IA和IB指针实际上都是本地的proxy,而客户端调用IB的方法将IA转给IB,则在服务器端的IB获得的IA是指向B的proxy呢,还是实际指向服务器端自已的IA?换句话说,服务器端的IB内部调IA的方法时,是否会在A和B两个机器间出现A-B-A的数据传输?因为IA和IB的实现都在服务器端,我希望是数据传输实际上只发生在A机器内部。更进一步地,如果IA和IB配置在同一个COM+ Context下,则COM+是否能识别IB和由B传来的IA实际上在同一个context下,而避免context包装和切换?

解决方案 »

  1.   

    听说是这样的
    {
      HRESULT hr;
      IStream *pStream = 0;
      hr = CreateStream(0, TRUE, &pSteam);
      hr = CoMarshalInterface(pStream, riid, &pStream, MSHCTX_DIFFERENTMACHINE, 0,MSHLFLAGS_NORMAL);  ULONG size;
      hr = CoGetMarshalSizeMax(&size, riid, pObject, MSHCTX_DIFFERENTMACHINE, 0,MSHLFLAGS_NORMAL);  HGLOBAL hg;
      hr = GetHGlobalFromStream(pStream, &hg);
      unsigned *buffer = (unsigned char *)GlobalLock(hg)
    }
    这段代码里面,可以把一个标准调度后的接口指针放在一个内存块里面,然后你可以随便在哪一个进程,哪一台机器上复制一个一模一样的内存块,然后你调用
      IStream *pStream = 0;
      hr = CreateStreamOnHGlobal(buffer , TRUE, &pStream);
      hr = CoUnmarshalInterface(pStream, riid, pObject);
      pStream->Release();
    只要原始对象处于运行状态,你这个解调度后的接口指针就会有效。
    我不知道是不是真的那么神奇,如果是的话,我想你的问题应该很好解决,如果A机器通过B机器的组件访问了A机器的组件,实际上只是把A机器上的目标组件的调度流拷贝到B,然后再拷贝到A,然后A才根据这个调度流调度目标组件的方法。
      

  2.   

    arxing(阿行)说的很准确。COM在接受你以这个参数进行街口调度的时候COM的Run_time对于当前的信息都知道,COM库回做相应的调度优化的。
    IStream *pStream 不是说在那台机器分配一块内存来反调度接口指针,一般作为消息参数或者线程函数的差数传递到需要的到该接口指针的地方去的。其实就是一个跨Thread/Process的调度。在本机会使用Mapping,跨机器使用Socket机制。
      

  3.   

    IStream是个流对象接口,当然不一定非要用内存来体现。只不过我为了更直观的显示它的内容,才把它建立内存映射。