2017-01-05 3 views
0

From C#私はC++で書かれたOLEインターフェイスを呼び出そうとしています。 C++コードの.ODLファイルから署名は、以下のとおりです。ここでC#から* VARIANTパラメータを必要とするアンマネージOLEインターフェイスを呼び出すにはどうすればよいですか?

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#typeなどのすべての組み合わせを試しましたが、私は成功していないと思います。

C++コードは変更できませんのでご注意ください。

何か提案がありがとうございます。

+0

https://msdn.microsoft.com/en-us/library/aa719104(VS.71).aspxを参照してください。VARIANTはObjectです。 –

答えて

0

VARIANTポインタをとる関数を呼び出すには、少なくとも2つの方法があります。

saneメソッドは、ref object dataというパラメータを宣言し、.NETがマーシャリングします。 This blog postにはさらに詳細と一例があります。

他の方法は、メモリ内にVARIANT構造体を作成して埋め込み、そのアドレスをIntPtrパラメータとして渡すだけです。これはおそらく過剰なものであり、VARIANTは大きくて複雑なので、StructLayoutは面白くないでしょう。

関連する問題