我目前遇到了需要将 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()
or SafeArrayCreateVector()
:
SAFEARRAY* psa
psa = SafeArrayCreate(VT_CLSID, 1, rgsabound);
我得到一个 NULLSAFEARRAY
指针,它应该指示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 中传递它们。
任何帮助表示赞赏,在此先感谢