我们有一个 COM 组件,它的实现和接口定义存在于托管代码中,但由本机组件驱动。托管组件SafeArray
通过以下方法声明返回到本机代码。
interface IExample {
<return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VarEnum.VT_UNKNOWN)>
object[] DoSomeOperation()
}
生成的本机签名正确地将其作为SafeArray
.
在代码审查期间,尽管我们提出了一些关于使用 SafeArrayGetElement 调用结果数组的问题。问题是 SafeArrayGetElement 是否返回 AddRef 的IUnknown
实例。本质上归结为以下哪一项是正确的
示例 1:
CComPtr<IUnknown> spUnk;
hr = SafeArrayGetElement(pArray, &bounds, reinterpret_cast<void**>(&spUnk));
示例 2:
IUnknown* pUnk;
hr = SafeArrayGetElement(pArray, &bounds, reinterpret_cast<void**>(&pUnk));
关于这个主题的文档非常薄。它仅包括以下行。
如果数据元素是字符串、对象或变量,则函数以正确的方式复制元素。
正确的定义有点模棱两可。