通过COM互操作传递IntPtr

时间:2013-05-29 23:23:04

标签: c# c++ com-interop

如何调用需要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?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

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