通过COM互操作传递IntPtr
Passing IntPtr through 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
吗?如果有,怎么做?
好吧,这不是VT_HANDLE,这是一个黑客从OleCtl.h。CLR的SSCLI20版本在CLR/src/vm/olvariant .cpp中有其变体封送代码。它将VT_INT类型转换为IntPtr类型。然而,这是一个32位类型,我认为如果这需要在64位代码中工作,您将需要VT_I8。
相关文章:
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 编译为 wasm 的 C++ 和 Rust 程序可以以某种方式互操作吗?
- 有什么语言可以与C++互操作吗
- 使 Flutter C/C++ 互操作示例正常工作
- C++互操作(隐式 PInvoke)的限制
- COM 互操作结构定义与内存布局不匹配
- _Complex 和 std::complex 之间的 C/C++ 互操作
- C# COM 服务器互操作 - System.InvalidCastException.
- 从C++与 C 灵活阵列成员互操作的正确方法是什么?
- 如何通过 COM 互操作访问复杂对象的属性?
- 如何区分"QObject"的亲子关系关注点,例如与其他所有者进行互操作?
- DirectWrite GDI 互操作:使用"IDWriteFontFace"绘制文本的简单方法
- opencl openGL互操作内核参数用于读取 写入
- Rust 互操作与 C++ std::string
- 将互操作 HwndSource 包装在 c++/cli 中,以用于本机 c++/MFC 应用程序
- 跨 C# 和 COM 互操作使用对象C++
- 尝试为c++互操作自动生成库时出错
- 在MS Visual Studio 2010上使用带有Cuda互操作的OpenGL缓冲区时出现异常错误
- WinRT 组件内C++类之间的互操作
- 通过COM互操作传递IntPtr