如何调用需要IntPtr
参数的接口方法?如果我的方法需要string
,那么这项工作正常,但如果需要IntPtr
则不行。这是C#中的示例界面:
[
Guid("etc-etc-etc"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch),
ComVisible(true)
]
public interface ICallback
{
[DispId(1)]
void CallbackWithString( string value );
[DispId(2)]
void CallbackWithHandle( IntPtr value );
}
我从这个接口派生一个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
?如果是这样,怎么样?
答案 0 :(得分:1)
嗯,这不是VT_HANDLE,这是来自OleCtl.h的黑客攻击。 CLR的SSCLI20版本在clr / src / vm / olevariant.cpp中有其变体封送代码。它将VT_INT转换为IntPtr。然而,这是一个32位类型,我认为如果需要在64位代码中工作,你将需要VT_I8。