C ++托管代码使用句柄调用非托管代码

时间:2010-12-15 18:21:10

标签: c++ .net unmanaged

经过一个下午的搜索,这个问题让我难过!我正在编写一个托管C ++应用程序,需要调用一些非托管代码。这是我需要调用的函数:

public: void Connect(
    [out] LONG* pCookieID, 
    [out] LONG* pNumberOfStreams, 
    [out] VARIANT* pMediaType
);

文档中有这样的说明:在调用Connect之前,参数pMediaType必须在C#中设置为null而在VB .NET中不能设置为空,否则会出现错误代码为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^

我搜索过高低,并尝试了各种解决方案,但我找不到任何解决方案。

0 个答案:

没有答案