Ste*_*eve 6 c# c++ com guid safearray
我目前遇到一个问题,需要将SAFEARRAY(GUID)作为返回值从C++传递给C#.
目前,C#端正在使用从Tlbimp.exe(类型库导入程序)生成的Interop dll.
IDL是:
HRESULT GetGuids(
[out]SAFEARRAY(GUID)* guids);
Run Code Online (Sandbox Code Playgroud)
我也试过[out,retval]
功能签名是:
HRESULT
WINAPI
MyClass::GetGuids(SAFEARRAY** guids)
Run Code Online (Sandbox Code Playgroud)
如果我使用SafeArrayCreate()
或SafeArrayCreateVector()
:
SAFEARRAY* psa
psa = SafeArrayCreate(VT_CLSID, 1, rgsabound);
Run Code Online (Sandbox Code Playgroud)
我得到一个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);
Run Code Online (Sandbox Code Playgroud)
这让我创建了数组,但是当SafeArrayPutElement()
我用它填充它时,我得到一个0x80070057的HRESULT(参数不正确).这可能是因为它也需要VT_CLSID
参数
我可以手动填充它 SafeArrayAccessData()
GUID* pData = NULL;
hResult = SafeArrayAccessData(*guids, (void**)&pData);
Run Code Online (Sandbox Code Playgroud)
但我从C#端得到一个错误:"该值不在预期的范围内"
我不确定如何通过retval或out参数完成将SAFEARRAY(GUID)返回到C#的所需功能.
它似乎应该很简单 - IDL中有很多区域我已经在没有任何UDT或编组的情况下传递GUID.一切正常,直到我需要在SAFEARRAY传递它们.
任何帮助表示赞赏,在此先感谢
你是绝对正确的 - 问题是VARIANT或SAFEARRAY中不允许使用VT_CLSID.归结为GUID不是自动化兼容类型.
我经常需要做你正在尝试的同样的事情.解决此问题的最简单方法是将GUID转换为字符串,然后传递SAFEARRAY(VT_BSTR).这种转换在某种程度上与谷物相反,但我认为你可以认为无论如何都会进行编组,这种转换是一种编组.