COM/Automation 如何在幕后进行 IPC?

jdm*_*jdm 6 windows com ipc

在其最简单的形式中,COM 允许您从应用程序中的 DLL 实例化类似 C++ 的类。基本上它是围绕 LoadLibrary 和一些关于接口的约定的美化包装器。这称为使用进程内组件。

但是 COM 也支持进程外组件。如果从这样的组件实例化一个类,COM 将启动一个新进程。您的对象存在于上述过程中,并且对您透明地编组,因此您不必太在意它们的位置。它们甚至可能位于不同的计算机 (DCOM) 上。您还可以从已经运行的应用程序中获取对象。一个众所周知的例子是通过脚本控制 MS Office。这称为自动化(以前称为 OLE 自动化,对于该术语的确切含义存在一些混淆)。

有几篇很好的文章解释了(进程内)COM 如何在低级别工作(例如COM from scratch。我想知道当你的组件在进程外时它是如何工作的。特别是,IPC 对 COM 做了什么使用引擎盖下的进程之间进行通信?窗口消息、共享内存、套接字或其他东西?MSDN 将 COM 单独列为 IPC 方法,但我猜它必须在下面使用其他东西。在不同的情况下是否使用了不同的 IPC 方法(从 C++ 实例化一个 OOP 组件,从 VBScript 访问一个 Excel 文档,通过 OLE 将一个文档嵌入另一个文档)?看起来它们都是相同的底层技术。最后,编组如何适应图片?我相信有必要序列化方法参数以在进程之间传输,对吗?

Joã*_*des 4

根据这篇MSDN文章,它是RPC。

当您实例化 OOP 组件时,COM 子系统会生成一个进程内代理。该代理负责打包参数和解包返回值。它还在服务器进程中生成一个存根,该存根按预期解包参数并打包返回值。

有趣的是,整个编组过程可以通过实现来定制IMarshal