从 C# 如何调用需要 *VARIANT 参数的非托管 OLE 接口
From C# how do I call an unmanaged OLE interface that requires a *VARIANT parameter?
从C#我试图调用用C++编写的OLE接口。来自 的签名。C++代码的ODL文件是:
long GetData1( int* data );
long GetData2( double* data );
long GetData3( VARIANT* data );
下面是我的 C# 代码示例:
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMyInterface
{
[DispId(1)]
long GetData1 ( [In, Out] ref int data );
[DispId(1)]
long GetData2 ( [In, Out] ref double data );
[DispId(3)]
long GetData3 ( [In, Out, MarshalAs(UnmanagedType.IUnknown)] ref IntPtr data);
}
GetData1() 和 GetData2() 工作正常,但 GetData3() 会导致"类型不匹配"异常。
对于 GetData3(),我已经尝试了 In、Out、Ref、MarshallAs()、C# 类型等的所有组合。我想不出成功。
请注意,C++代码无法更改。
任何建议将不胜感激。
(至少)有两种方法可以调用采用 VARIANT 指针的函数。
理智的方法是将参数声明为 ref object data
,.NET 将为你封送。这篇博文提供了更多详细信息和示例。
另一种方法是自己在内存中创建并填写 VARIANT 结构,然后将地址作为 IntPtr 参数传递。这可能是矫枉过正,并且变体又大又复杂,因此它的StructLayout不会很有趣。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在给定 std::variant 的情况下检索模板参数包?
- 如何构造一个 std::variant 类型对象,其自身 Templated 和构造函数转发参数
- 如何检查模板参数是否为 std::variant?
- 在 std::variant 中隐藏模板参数
- 从 C# 如何调用需要 *VARIANT 参数的非托管 OLE 接口
- 错误 C2664:'VariantCopy':无法将参数 2 从 'const VARIANT *' 转换为 'VARIANTARG *'
- Boost.Spirit with Boost.Variant 和 C++11:期待一个零参数构造函数
- std::any_cast()和std::get_if(std::variant)是否绝对需要将指针作为参数