COM可以支持重载方法吗?

时间:2013-06-04 16:01:47

标签: com atl

我想创建一个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);
}

提前致谢, -Neel。

1 个答案:

答案 0 :(得分: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当时也不支持它们。

长话短说:不。