本来想结另一个贴子,却误结了http://www.csdn.net/expert/topic/825/825468.xml?temp=.636532
以下是该贴的内容:假设有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包装和切换?
回复人: arxing(阿行)
听说是这样的
{
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才根据这个调度流调度目标组件的方法。
回复人: luomingchao()
arxing(阿行)说的很准确。COM在接受你以这个参数进行街口调度的时候COM的Run_time对于当前的信息都知道,COM库回做相应的调度优化的。
IStream *pStream 不是说在那台机器分配一块内存来反调度接口指针,一般作为消息参数或者线程函数的差数传递到需要的到该接口指针的地方去的。其实就是一个跨Thread/Process的调度。在本机会使用Mapping,跨机器使用Socket机制。我可能没有表达清楚,我不是不知道如何在两个机器间传递接口,而是想知道在两个机器间传递一个实际上在一个机器上实现的接口时,会不会造成调度流(包括调用参数,它可能有好几十K!)在两个机器间流动,我希望调度流能在一台机器中流动,甚至如何两个组件配置在同一个COM+应用时,不发生调度。
以下是该贴的内容:假设有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包装和切换?
回复人: arxing(阿行)
听说是这样的
{
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才根据这个调度流调度目标组件的方法。
回复人: luomingchao()
arxing(阿行)说的很准确。COM在接受你以这个参数进行街口调度的时候COM的Run_time对于当前的信息都知道,COM库回做相应的调度优化的。
IStream *pStream 不是说在那台机器分配一块内存来反调度接口指针,一般作为消息参数或者线程函数的差数传递到需要的到该接口指针的地方去的。其实就是一个跨Thread/Process的调度。在本机会使用Mapping,跨机器使用Socket机制。我可能没有表达清楚,我不是不知道如何在两个机器间传递接口,而是想知道在两个机器间传递一个实际上在一个机器上实现的接口时,会不会造成调度流(包括调用参数,它可能有好几十K!)在两个机器间流动,我希望调度流能在一台机器中流动,甚至如何两个组件配置在同一个COM+应用时,不发生调度。
解决方案 »
- movetoex函数的问题
- YUV2转RGB显示问题 能显示就给分(可以再加)
- VC奇怪问题,请教高手!!
- 续--- 我一个C文件,想嵌入到Vc中来,但不知如何访问文件的变量和函数??
- 怎样实现点击鼠标左键调用ExtFloodFill函数给封闭区域填充颜色?
- 求一本书《Insede OLE, Second Edition》,不知那位能提供一下!感激不尽!
- 我来散分,分数给最后回帖的10个人?
- 请问如何保存 treeview 的所有信息到指定文件中
- 在VC中, 为何每次都要重新编译?
- 执行了显示列表中的绘制命令但被绘制的图像未显示出来
- 问一个本论坛从未问过的ActiveX的主流问题!!!高手请进!
- 请问,在多个不同页面(数据不同)调用activex控件,却会显示同样的记录数据
这个问题我以前也没有考虑过。
不过涉及到远程调用的话,传递接口不是个好办法吧?
假定我一开始说的成立。
客户获得服务器的IA,IB,就是把IA,IB分别CoMarshalInterface,获得两块内存GA,GB,拷贝到客户端上。
然后客户调用IB,这时候要把IA作为参数传递进去,调度算法就把GA拷贝回服务端,服务器端可以通过GA反调度,从而执行IA的方法。
因为GA自始至终只是从服务器拷贝到客户端,然后在拷贝回服务器,因此它跟第一次Marshal获得的GA是一样的,这时候服务器不管通过哪个GA来反调度获取IA接口,应该来说是一模一样,所以你尽管你的接口传递跑了个来回(开销比较小),但是对于它的方法的执行(最大的开销),应该也是一模一样的。我的理解是这样,也许表达得不太清楚,而且没有可以考究的证据,前提是从书上看到的,没有验证过。