经过一个下午的搜索,这个问题让我难过!我正在编写一个托管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^
我搜索过高低,并尝试了各种解决方案,但我找不到任何解决方案。