当您创建一个供公共使用的 COM 对象时,对于如何使您的接口可供公共使用,您有不同的选择。
如果您只想让您的 COM 对象可用于支持指针和 vtable 之类的低级编程语言(如 C++、C、C# 等),您可以创建一个继承自 IUnknown 的“自定义”接口。
这种方法的问题是您的 COM 对象将无法用于脚本客户端(VBScript、JScript、WScript 等),因为这些客户端不理解指针和 vtable。相反,您可以将 COM 对象接口实现为 IDispatch 的派生。IDispatch 提供了一些方法,允许脚本客户端在运行时而不是编译时动态发现其方法和属性。但是,此过程的效率低于使用 IUnknown,因为客户端必须在调用所需 COM 对象的方法之前进行额外的方法调用。
因此,如果您只针对低级编程语言,您可以使用从 IUnknown 继承的“自定义”接口来实现您的 COM 接口
如果您只针对脚本客户端,则可以仅使用 IDispatch 实现您的接口。
如果您希望您的 COM 对象可用于脚本语言,并且您还希望低级语言能够以非常有效的方式调用您的方法,那么您应该实现两者,这称为“双”。可能,Microsoft 的示例都是“双重”的,因为他们希望他们的示例同时使用脚本和低级语言(低级语言可以使用 IDispatch,但它需要更多的工作)。
有关更多信息,我建议您观看PluralSight 的 .Net 互操作性课程(您可以注册免费试用订阅)。本课程的“COM”部分向您展示了如何创建非双(简单的 IUnknown 接口)以及“双”接口。