3

如何调用需要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 );

“不起作用”是指未调用该函数,但不会引发异常。

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

4

1 回答 1

1

好吧,这不是 VT_HANDLE,这是来自 OleCtl.h 的 hack。CLR 的 SSCLI20 版本在 clr/src/vm/olevariant.cpp 中有其变体编组代码。它将 VT_INT 转换为 IntPtr。然而,这是一种 32 位类型,如果需要在 64 位代码中工作,我认为您将需要 VT_I8。

于 2013-05-29T23:39:22.310 回答