跨进程传递IUnknown指针,怎么做?

ecore2Aftron 2003-10-18 07:13:44
在进程间传递IUnknown接口指针.
作为客户程序,它CoCreateInstance加载一个进程内的COM对象;然后它自己又是一个COM对象,它希望把刚才CoCreateInstance出来的这个COM对象传递给另外一个不同的进程.
我希望是把其IUnknown指针通过一个接口的成员函数以out参数传递给不同的进程.那么其他进程获得的这个IUnknown指针是否和现在这个IUnknown指针都真的同一个对象呢(当然,不考虑proxy/stub的问题).
另外,当然,那个进程内的COM对象所有的接口都可marshaling.
...全文
166 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
panzhaoping 2003-10-24
  • 打赏
  • 举报
回复
可以创建proxy/stub机制的,通过channel是不可以传了吗
Analyst 2003-10-22
  • 打赏
  • 举报
回复
必须要是进程外组件才可以跨进程传递。
ecore2Aftron 2003-10-21
  • 打赏
  • 举报
回复
另外,自然我的意思是,把这个IUnknown传递给其他进程后,那个进程可以用这个IUnknown进行操作么?调用接口函数......
那估计列集得工作实现了很多东西,比如proxy/stub上每次调用这个IUnknown上面得接口函数就要到原始得COM对象上去做一次,再把out参数送这边来.(说得含糊,不好意思)
那我QueryInterface后呢?也支持么?支持我Query到一个我得自定义接口?(当然,这个接口本身已经有proxy/stub了),可这个QueryInterface得动作能等同于在原始得COM对象上去QueryInterface么?

另外,各位不好意思,再请看一个问题:
http://expert.csdn.net/Expert/topic/2377/2377886.xml?temp=.8400537
ecore2Aftron 2003-10-21
  • 打赏
  • 举报
回复
谢谢大家.
有一些疑问的:
它怎么做到这一点,难道在proxy/stub中真的放上一个COM对象????
我也觉得应该可以的,因为最明显的,连接点技术中的客户实现的sink的IUnknown接口指针.
显然,sink可以是跨进程或者跨网络的组件.
zyong310 2003-10-21
  • 打赏
  • 举报
回复
我觉着是可以的,我记得做过一个DCOM的例子程序,当时是这样的:一个客户端程序DClient,一个服务器程序DServer,一个负载均衡服务器LoadBalancer,DClient请求LoadBalancer创建一个对象,传递的参数是CLSID,IID和指向IID的pInterface,LoadBalancer负责实际的创建对象并且把接口指针传递回DClient,这样对象的位置对于DClient来说就是透明的了,保证了负载均衡,我觉着我的情况和你的很相似,只要接口指针被正确的列集和散集,在进程之间传递是没有问题的。
zyong310 2003-10-21
  • 打赏
  • 举报
回复
怎么会呢?我的确返回了啊,并且用的很好,如果是任意接口需要指定iid_is属性,如果是IUnknown指针就不需要了,标准列集会处理。如果指定了iid_is就不能指定dual和oleautomation了,否则标准列集出错。按照我说的这样,我的确可以做到:Loadbalancer进程创建DServer对象,然后把这个对象的接口指针返回给了DClient,并且DClient可以正确调用,在传递过程中COM库可以正确列集已知的对象指针。
XXandOO 2003-10-21
  • 打赏
  • 举报
回复
楼上的说的是使用借口查询实现的,这时借口指针是个out参数(调用了queryinterface函数),实际上这时的列集和散集是由com库完成的,而借口指针作为已知值在套间(包括进程)之间传递时,是不会自动列集和散集的。
XXandOO 2003-10-18
  • 打赏
  • 举报
回复
借口指针传递过去也没用,它在另一个套间都没意义,别说另一个进程了。一个可行的方法是使用手工列集,把列集后的stream作为参数传递给接收进程,在接收进程中散集并获得一个借口指针,这个借口指针就可以使用了,具体的列集/散集函数名你自己查查书吧,我记不清了。
另外,一般来说,手工列集是不需要的,往往是你的模块设计不够成熟。
microran2000 2003-10-18
  • 打赏
  • 举报
回复
如果强制把这个指针作为一个一般的数据传送到另外一个进程,应该是有办法的.传统意义上的消息传递,创建内存共享文件 注册表 本地文件等等都可以把这个数据传送过去.但是问题在于传送过去的指针,能否跨进程操作,我们知道WIndowNT对系统中进程间是相互隔离的,一个进程不能存取另外一个进程的内容,它们之间有着彼此独立的内存影像.即便你能够把这个指针还原成IUnknown指针然后,你能够得到你IDipatch指针么,能够通过QueryInterface得到其他指针吗?
我想你应该在另外一个进程中也创建一个组件对象,这两个组件对象只是增加了引用.如果你本身有组件源代码,你可以通过创建共享段实现数据共享.

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧