C# 通过COM互操作传递IntPtr

C# 通过COM互操作传递IntPtr,c#,c++,com-interop,C#,C++,Com Interop,如何调用需要IntPtr参数的接口方法?如果我的方法需要一个字符串,但如果它需要IntPtr,那么它就可以正常工作。下面是C#中的一个示例接口: 我从C接口中派生出一个COM类,并将它的调度传递到C++应用程序(通过COM)。稍后,C++应用程序调用我的方法在该调度上提供通知回到C应用程序。 这是有效的: CComPtr<IDispatch> obj; // My C# COM interop object, stored in my C++ app VARIANT arg

如何调用需要
IntPtr
参数的接口方法?如果我的方法需要一个
字符串
,但如果它需要
IntPtr
,那么它就可以正常工作。下面是C#中的一个示例接口:

我从C接口中派生出一个COM类,并将它的调度传递到C++应用程序(通过COM)。稍后,C++应用程序调用我的方法在该调度上提供通知回到C应用程序。 这是有效的:

CComPtr<IDispatch> obj;      // My C# COM interop object, stored in my C++ app
VARIANT arg;

arg.vt = VT_BSTR;
arg.bstrVal = myString;
obj.InvokeN( L"CallbackWithString", &arg, 1 );
arg.vt = VT_HANDLE;          // I also tried VT_BYREF, VT_VOID|VT_BYREF, and VT_INT_PTR
arg.byref = myHandle;
obj.InvokeN( L"CallbackWithHandle", &arg, 1 );
所谓“不工作”,我的意思是没有调用函数,但没有引发异常


是否可以通过COM互操作发送
IntPtr
?如果是这样,怎么做?

好吧,这不是VT_HANDLE,这是来自ocletl.h的黑客攻击。CLR的SSCLI20版本在CLR/src/vm/olevariant.cpp中有其变体封送处理代码。它将VT_INT转换为IntPtr。不过,这是一种32位类型,如果需要在64位代码中工作,我认为您需要VT_I8。

谢谢Hans。如果我的参数声明为
IntPtr
,它仍然不起作用。我必须把它改成整数。我使用了
UInt64
,尽管我只使用32位代码。我本来不想这样做,而是使用
IntPtr
,但这似乎会让我感到沮丧。
arg.vt = VT_HANDLE;          // I also tried VT_BYREF, VT_VOID|VT_BYREF, and VT_INT_PTR
arg.byref = myHandle;
obj.InvokeN( L"CallbackWithHandle", &arg, 1 );