如何对 COM 中的方法进行返回类型?

Posted

技术标签:

【中文标题】如何对 COM 中的方法进行返回类型?【英文标题】:How to do return types on methods in COM? 【发布时间】:2014-01-11 01:12:44 【问题描述】:

我知道 COM 现在已经过时了,但我们时不时地需要对其进行一些工作。我在 Visual Studio 中处理 ATL COM 应用程序,我尝试向接口添加一个方法,但它不允许我将返回类型从 HRESULT 更改为其他类型,如 long 或 BSTR。

我不记得它是如何完成的,可能是通过一些输出参数。谁能告诉我我们如何在 COM 接口方法中返回类型?

【问题讨论】:

【参考方案1】:

COM中的返回类型总是HRESULT(除了特殊方法AddRef和Release),所以需要使用out参数:

HRESULT GetString([out] BSTR* val);

您还可以添加retval 属性以将输出参数转换为脚本语言(使用IDispatch)的返回值:

HRESULT GetString([out, retval] BSTR* val);

【讨论】:

通过IDispatch接口在编译语言中使用时是否会被视为返回值?我希望在目标语言中像“string s = GetString()”一样使用它 好的,我找到了。它是 [out, retval] COM 中的返回类型并不总是 HRESULT。我可以是简单的类型(INT、BOOL)或基本上任何东西,只要可以正确编组它(例如:msdn.microsoft.com/en-us/library/aa370234.aspx)。不过还是推荐的。 非 HRESULT 方法始终是本地的,不能被封送。所以从技术上讲你是对的,但它不是一个真正的 COM。来自 MSDN 的引用:[“非 [本地] 对象接口成员函数的返回值必须为 HRESULT 或 SCODE。”](msdn.microsoft.com/en-us/library/windows/desktop/…)

以上是关于如何对 COM 中的方法进行返回类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何对具有 Mono 返回类型的方法进行 junit 测试

Java中的通用方法-如何将参数类类型作为返回类型返回[重复]

如何根据枚举哈希对数组进行排序并返回 Ruby 中的最大值?

js_Array类型_迭代方法

array类型中的迭代和归并方法

如何实现带返回类型的接口方法是Golang中的一个接口