1

我想创建一个 COM 组件,它有两个接口,一个从另一个派生而来,我知道这在 COM 中是可能的。但是我想知道使用一个相互派生的接口是否可以以某种方式绕过不能使用重载方法的限制?例如

interface IMyInterface : IDispatch {
     [id(1), helpstring("method OverloadedMethod")] HRESULT OverloadedMethod(BSTR someName);
}

interface IYourInterface : IMyInterface {
   [id(1), helpstring("method OverloadedMethod")] HRESULT OverloadedMethod(BSTR someName, LONG someParam2);
}

在此先感谢,-尼尔。

4

1 回答 1

1

重载解析完全是编译器实现的细节。在其核心,COM 完全不知道方法的名称。它所知道的只是一个标识接口的 GUID 和一个指向实现这些方法的方法的跳转地址表。

例如,在高端,这在 WinRT 中得到了利用。一个以 COM 为核心的 API。C++/CX 和 .NET 的语言投影确实支持 WinRT 方法重载。这是可能的,主要是因为 WinRT 使用更高级的方式来描述接口。.winmd 文件格式使用与 .NET 相同的元数据格式,并且能够描述方法重载。由更高级的 IDL 语法版本支持,允许添加注释以将原始方法映射到重载方法名称。

但这是大多数 COM 场景中的未来音乐,就像你描述的那样。编写客户端代码以使用您的 [ComVisible] 程序集的程序员使用的编译器将使用您从程序集生成的类型库。使用 Tlbexp.exe 或 Regasm.exe /tlb 选项。.tlb 文件格式非常古老,可以追溯到 1996 年,最初设计用于 Visual Basic。它不能描述方法重载,VB当时也不支持它们。

长话短说:没有。

于 2013-06-04T16:24:36.910 回答