В настоящее время у меня возникает проблема передачи 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 или маршалинга. Все работает нормально, пока мне не понадобится передать их в БЕЗОПАСНОСТИ.
Любая помощь приветствуется, Заранее благодарен