【问题标题】:Can COM be made to support overloaded methods?可以使 COM 支持重载方法吗?
【发布时间】:2013-06-05 00:24:36
【问题描述】:

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

提前致谢, -尼尔。

【问题讨论】:

    标签: com atl


    【解决方案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当时也不支持。

    长话短说:没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多