COM SAFEARRAY GUID, возвращаемых из C ++ в C #

В настоящее время у меня возникает проблема передачи SAFEARRAY (GUID) в качестве возвращаемого значения из C ++ в C #.

] В настоящее время на стороне C # используется DLL Interop, созданная из Tlbi. mp.exe (импортер библиотеки типов).

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 () я получаю HRESULT 0x80070057 (Неверный параметр). Вероятно, это связано с тем, что он также принимает параметр VT_CLSID

. Я могу заполнить его вручную с помощью SafeArrayAccessData ()

GUID* pData = NULL;
hResult = SafeArrayAccessData(*guids, (void**)&pData);

, но я получаю сообщение об ошибке со стороны C #: «Значение не попадает в ожидаемый диапазон»

Я не уверен, как выполнить желаемую функциональность по возврату SAFEARRAY (GUID) в C # с помощью параметра retval или out.

Кажется, это должно быть просто - в IDL есть много областей, где я уже передаю GUID без каких-либо UDT или маршалинга. Все работает нормально, пока мне не понадобится передать их в БЕЗОПАСНОСТИ.

Любая помощь приветствуется, Заранее благодарен

6
задан Richard Chambers 2 September 2016 в 01:01
поделиться