通过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吗?如果有,怎么做?

通过COM互操作传递IntPtr

好吧,这不是VT_HANDLE,这是一个黑客从OleCtl.h。CLR的SSCLI20版本在CLR/src/vm/olvariant .cpp中有其变体封送代码。它将VT_INT类型转换为IntPtr类型。然而,这是一个32位类型,我认为如果这需要在64位代码中工作,您将需要VT_I8。