gpt4 book ai didi

c# - 通过 COM 互操作传递 IntPtr

转载 作者:太空狗 更新时间:2023-10-29 23:06:09 30 4
gpt4 key购买 nike

如何调用需要 IntPtr 参数的接口(interface)方法?如果我的方法需要 string,这就可以正常工作,但如果它需要 IntPtr,则不行。下面是 C# 中的示例接口(interface):

[
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# 中从该接口(interface)派生了一个 COM 类,并将其调度传递到我的 C++ 应用程序(通过 COM)。稍后,该 C++ 应用程序会在该分派(dispatch)上调用我的方法,以将通知返回给 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 的 hack。 CLR 的 SSCLI20 版本在 clr/src/vm/olevariant.cpp 中有其变体编码(marshal)处理代码。它将 VT_INT 转换为 IntPtr。然而,这是一个 32 位类型,如果这需要在 64 位代码中工作,我认为你需要 VT_I8。

关于c# - 通过 COM 互操作传递 IntPtr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16825529/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com