【问题标题】:From C# how do I call an unmanaged OLE interface that requires a *VARIANT parameter?从 C# 如何调用需要 *VARIANT 参数的非托管 OLE 接口?
【发布时间】:2017-01-05 22:21:03
【问题描述】:

我试图从 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++ 代码不能更改。

任何建议将不胜感激。

【问题讨论】:

标签: c# c++ ole variant


【解决方案1】:

(至少)有两种方法可以调用采用 VARIANT 指针的函数。

理智的方法是将参数声明为ref object data,.NET 将为您编组。 This blog post 有更多细节和示例。

另一种方法是自己在内存中创建和填充一个 VARIANT 结构,然后将地址作为 IntPtr 参数传递。这可能有点矫枉过正,而且 VARIANT 又大又复杂,所以它的 StructLayout 不会很有趣。

【讨论】:

    猜你喜欢
    • 2013-12-29
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多