2009-08-30 13 views
0

私はC++(.NETではなく)から使用しようとしているCOMオブジェクトを持っており、すべてのサンプルプログラムとマニュアルは、 C#.NETまたはVB.NETのCOMは私には新しく、私は少し圧倒される。私はTLB上で#importを使用していますが、パラメータとして使用されているバリアントに対処するのに苦労しています。私は特定の方法を持っています。ドキュメントやC#.NETのサンプルプログラムでは、オブジェクト[]を返すことになっています。次に、この配列の最初の項目をControlEventにキャストして、配列内の残りのオブジェクトをどのように処理するかを教えています。 C#.NETの例は、次のようになります。私の場合はC#.NETでCOMオブジェクトを使用するとC#.NETでオブジェクトが返される

object [] objEvent = (object []) Ctl.GetEvent(); 
ControlEvent ev = (ControlEvent) objEvent[0]; 

、のGetEventは私に_variant_tを返していると私は[]ので、私はさらに処理することができ、そのオブジェクトにこれを変換する方法を知っておく必要があります。 C++で 'オブジェクト'をどのように表現しているかについても私には分かりません。私はバリアントを変換することができる万のものを私に示す_variant_tのドキュメントを見ていますが、それらのどれも私が使用できるものに変換していないようです。私は上記のC#.NETコードをVisual C++に変換する助けを願っています

ありがとうございました。

答えて

1

通常、バリアントのメンバーであるvtを見て、実際にどのような種類のものかを確認します。この場合、配列であると予想されるので、vartypeはVT_ARRAYのバリエーションとなることが予想されます(通常、メンバーの型とビット単位で論理和が取られています)。次に、実際に配列を保持するSAFEARRAYインスタンスを含むparrayメンバを取得し、通常の安全な配列関数を使用して配列からデータを取り出します。

+0

ありがとうございます、私は正しい軌道に乗ったと思います。 vtはVT_ARRAYです。 VT_VARIANT、API呼び出しから戻ってきます。SafeArrayには2つの要素があり、それぞれがVT_I4です。しかし、両方のlValは0なので、私はまだこれらのVT_I4をオブジェクトへのポインタに変換するはずです。 – bdk

+0

'SAFEARRAY'要素を取得するために使用したコードを表示して、' VT_I4'を取得できますか? –

+0

_variant_t v = m_pCtl-> getNextEvent() printf( "バリアント型は%x \ n"、v.vt)です。 [プリント0x200c] _variant_t項目 LONG IDX = 0 HRESULTのHR = SafeArrayGetElement(v.parray、&IDX、&アイテム) 場合(時間== S_OK) のprintf( "要素タイプがある:%Dを\ n"、 item.vt); [[prints 3]] – bdk

1

私はこれを行っていないが、_variant_tクラス(と私のオリジナルのポストを修正し、その下のコメント)のドキュメントを読んでから、私はあなたが_variant_tインスタンスのvtフィールド(の実際VARTYPE vtフィールドを読むべきだと思いますVARIANTインスタンス:VARIANT構造体のリファレンスドキュメントに記載されているように、_variant_tインスタンスはVARIANTから直接派生しています)。どのタイプのものがバリアントに含まれているかを知っている人は、対応するタイプ固有の演算子を使用してそれを読み取ることができます。

COMを理解せずに使用しようとすると傷つきます(そのことを説明する本が必要な場合もあります)。たとえば、IUnknownインターフェイスとAddRefメソッドについてよく知っておく必要があります。

+0

外部インタフェースに完全に渡す必要がある場合を除き、VARIANTインスタンスを_variant_tラッパーから切り離さないでください。 _variant_tは、基本的なインスタンスとして多かれ少なかれ扱うことができるスマートなラッパークラスです –

+0

他の(VARIANTを削除せずに)あなたはVARIANTのvtフィールドの値を読んでいますか?ドキュメントではVARTYPEを返す_variant_tメソッドはありません。 – ChrisW

+0

instance.vtを実行する - _variant_tインスタンスはVARIANTから直接派生します –

関連する問題