【发布时间】:2011-10-15 12:56:14
【问题描述】:
我目前遇到了需要将 SAFEARRAY(GUID) 作为返回值从 C++ 传递到 C# 的问题。
目前 C# 端正在使用从 Tlbimp.exe(类型库导入器)生成的 Interop dll。
IDL 是:
HRESULT GetGuids(
[out]SAFEARRAY(GUID)* guids);
我也试过 [out, retval]
函数签名是:
HRESULT
WINAPI
MyClass::GetGuids(SAFEARRAY** guids)
如果我使用SafeArrayCreate() 或SafeArrayCreateVector():
SAFEARRAY* psa
psa = SafeArrayCreate(VT_CLSID, 1, rgsabound);
我得到一个 NULL SAFEARRAY 指针,它应该指示 E_OUTOFMEMORY 这是不正确的。
我发现VT_CLSID 仅适用于 Ole 属性集,而不适用于 SAFEARRAY:
http://poi.apache.org/apidocs/org/apache/poi/hpsf/Variant.html表示CLSID是
我还尝试了另一种构造安全数组的方法:
SafeArrayAllocDescriptor() 和 SafeArrayAllocData()。
hResult = SafeArrayAllocDescriptor(1, guids)
hResult = SafeArrayAllocData(*guids);
这让我可以创建数组,但是当用SafeArrayPutElement() 填充它时,我得到一个 0x80070057 的 HRESULT(参数不正确)。这可能是因为它也采用了VT_CLSID 参数
我可以用SafeArrayAccessData()手动填充它
GUID* pData = NULL;
hResult = SafeArrayAccessData(*guids, (void**)&pData);
但我从 C# 端收到一个错误: "值不在预期范围内"
我不确定如何通过 retval 或 out 参数实现将 SAFEARRAY(GUID) 返回到 C# 的所需功能。
看起来应该很简单 - IDL 中有很多区域我已经在传递 GUID 而没有任何 UDT 或编组。一切正常,直到我需要在 SAFEARRAY 中传递它们。
任何帮助表示赞赏, 提前致谢
【问题讨论】: