GUID的COM SAFEARRAY从C++返回到C#

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传递它们.

任何帮助表示赞赏,在此先感谢

Cia*_*ing 5

你是绝对正确的 - 问题是VARIANT或SAFEARRAY中不允许使用VT_CLSID.归结为GUID不是自动化兼容类型.

我经常需要做你正在尝试的同样的事情.解决此问题的最简单方法是将GUID转换为字符串,然后传递SAFEARRAY(VT_BSTR).这种转换在某种程度上与谷物相反,但我认为你可以认为无论如何都会进行编组,这种转换是一种编组.