2

我有两个 .exe 应用程序。它们中的每一个都包含与自动化兼容的接口,并在项目 IDL 中进行了描述。所以,我对这两个应用程序都有 tlb 。需要从运行在另一个/不同应用程序中的代码组织实现其中一个接口的类的调用方法。它在 COM 服务器和 COM 客户端中的工作方式引发了进程外边界。但是接口是隐私的,没有在注册表中注册,所以标准的 CoMarshalInterface/CoUnmarshalInterface 不起作用。我该怎么做,手动组织编组(所有必需的数据都存在:tlb,自动化兼容接口)?

PS 看起来像这样,但没有注册。

4

2 回答 2

3

如果类型库可用并已注册,您可能希望 COM 使用类型库信息自动创建代理/存根对。然而,这不是唯一的方法,COM 将首先查询对象是否能够通过IMarshal接口、IMarshal::MarshalInterface方法将自身编组到流中。

MSDN 上的 Marshaling Details写道

自定义封送处理对于实现它的对象来说是固有的。它使用由对象实现的代理,并在运行时根据请求提供给系统。实现自定义封送处理的对象必须实现 IMarshal 接口,而支持标准封送处理的对象则不需要。

通过以这种方式实现自定义编组,您的 COM 对象将其基本信息保存到流中,并提供CLSID解组器以在另一端重新创建接口。数据将通过进程边界传递,您的对象将被实例化并提供此流数据,以便您重新创建相关接口。

因此,实现IMarshal和朋友,您将能够集成到 COM 处理中,而无需注册或什至可用您的类型库。

于 2012-10-11T15:57:40.993 回答
0

要通信两个包含 COM 对象的进程,您可以使用 ROT(运行对象表),这里有一个示例展示如何做到这一点。

于 2012-10-11T18:17:13.190 回答