После полудня поисков эта проблема поставила меня в тупик!Я пишу управляемое приложение C ++, которое должно вызывать некоторый неуправляемый код.Это функция, которую мне нужно вызвать:
public: void Connect(
[out] LONG* pCookieID,
[out] LONG* pNumberOfStreams,
[out] VARIANT* pMediaType
);
И в документации есть следующее примечание: параметр pMediaType
должен быть равен нулю в C#
и ничего в VB .NET
перед вызовом Connect, иначебудет сгенерировано исключение с кодом ошибки DISP_E_TYPEMISMATCH = 0x80020005
.
Так что мне нужно передать 3 дескриптора функции, чтобы она возвращала данные в них.Две ручки LONG
кажутся достаточно простыми, но я не могу понять, как передать дескриптор для варианта.
Вот где я должен:
int ^cookieID;
int ^numberOfStreams;
System::Object ^buffer;
GCHandle hcookieID = GCHandle::Alloc(cookieID, GCHandleType::Pinned);
GCHandle hnumberOfStreams = GCHandle::Alloc(numberOfStreams,
GCHandleType::Pinned);
GCHandle hbuffer = GCHandle::Alloc(buffer, GCHandleType::Pinned);
parser->Connect(hcookieID.AddrOfPinnedObject().ToInt32(),
hnumberOfStreams.AddrOfPinnedObject().ToInt32(),
(System::Object^)hbuffer.AddrOfPinnedObject().ToInt32());
hcookieID.Free();
hnumberOfStreams.Free();
hbuffer.Free();
Компилятор принимает это, но когда вызывается метод Connect
, я получаю следующую ошибку:
"Type mismatch. (Exception from HRESULT: 0x80020005
(DISP_E_TYPEMISMATCH))"} System::Exception^
Я искал все выше и ниже и пробовал все виды решений, но не могу найти ни одного.