通过COM互操作传递IntPtr
本文关键字:IntPtr 互操作 COM 通过 | 更新日期: 2023-09-27 18:15:53
如何调用需要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
吗?如果有,怎么做?
好吧,这不是VT_HANDLE,这是一个黑客从OleCtl.h。CLR的SSCLI20版本在CLR/src/vm/olvariant .cpp中有其变体封送代码。它将VT_INT类型转换为IntPtr类型。然而,这是一个32位类型,我认为如果这需要在64位代码中工作,您将需要VT_I8。