【问题标题】:Is there a way to manually organize COM marshaling?有没有办法手动组织 COM 编组?
【发布时间】:2012-10-02 08:28:43
【问题描述】:
我有两个 .exe 应用程序。它们中的每一个都包含与自动化兼容的接口,并在项目 IDL 中进行了描述。所以,我对这两个应用程序都有 tlb 。需要从运行在另一个/不同应用程序中的代码组织实现其中一个接口的类的调用方法。它在 COM 服务器和 COM 客户端中的工作方式引发了进程外边界。但是接口是隐私的,没有在注册表中注册,所以标准的 CoMarshalInterface/CoUnmarshalInterface 不起作用。
我该怎么做,手动组织编组(所有必需的数据都存在:tlb,自动化兼容接口)?
附:看起来像 this 但没有注册。
【问题讨论】:
标签:
c++
com
automation
marshalling
【解决方案1】:
如果类型库可用并已注册,您可能希望 COM 使用类型库信息自动创建代理/存根对。然而这不是唯一的方法,COM 将首先通过IMarshal 接口、IMarshal::MarshalInterface 方法查询对象是否能够将自己编组到流中。
MSDN 上的编组详细信息writes:
自定义封送处理对于实现的对象而言是固有的
它。它使用由对象实现的代理并提供给
系统在运行时请求。实现自定义的对象
封送必须实现 IMarshal 接口,而对象
不支持标准编组。
通过这种方式实现自定义编组,您的 COM 对象将其基本信息保存到流中,并且它提供了 CLSID 的 unmarshaler 以在另一端重新创建接口。数据将通过进程边界传递,您的对象将被实例化并提供此流数据,以便您重新创建相关接口。
因此,实现IMarshal 和朋友,您将能够集成到COM 处理中,而无需注册或什至可用您的类型库。
【解决方案2】:
要通信两个包含 COM 对象的进程,您可以使用 ROT(运行对象表),这里有一个 sample 展示如何做到这一点。