C ++ управляемый код, вызывающий неуправляемый код с дескрипторами - PullRequest
1 голос
/ 15 декабря 2010

После полудня поисков эта проблема поставила меня в тупик!Я пишу управляемое приложение 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^

Я искал все выше и ниже и пробовал все виды решений, но не могу найти ни одного.

...