0

C ++(.NETではない)から使用しようとしているCOMオブジェクトがあり、すべてのサンプルプログラムとマニュアルは、C#.NETまたはVB.NETの使用を想定して作成されています。COMは私にとって新しいので、私は少し圧倒されています。TLBで#importを使用していますが、パラメーターとして使用されるバリアントを処理するのに苦労しています。私は1つの特定のメソッドを持っています。それは、C#.NETのドキュメントとサンプルプログラムによると、object[]を返すことになっています。次に、この配列の最初のエントリをControlEventにキャストし、配列内の残りのオブジェクトをどう処理するかを指示します。C#.NETの例は次のようになります。

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

私の場合、GetEventは私に_variant_tを返します。さらに処理できるように、これをobject[]に変換する方法を知る必要があります。C++で「オブジェクト」をどのように表現するかさえ私にはわかりません。_variant_tのドキュメントには、バリアントを変換できるものが何百万も示されていますが、使用できるものに変換されているものはないようです。上記のC#.NETコードをVisualC++に変換するための支援を期待しています

ありがとう。

4

2 に答える 2

1

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

于 2009-08-30T02:58:36.490 に答える
1

私はこれを行っていませんが、クラスのドキュメント(および私の元の投稿を修正した以下のコメント)を読むことから、 インスタンスのフィールド(実際にはインスタンスのフィールド:インスタンスはから直接派生します_variant_t)を読む必要があると思います)構造体のリファレンスドキュメントで説明されているように、含まれているものの種類を確認します。バリアントに含まれているもののタイプがわかっている場合は、対応するタイプ固有の演算子を使用して読み取ります。vt_variant_tVARTYPE vtVARIANT_variant_tVARIANTVARIANT

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

于 2009-08-30T03:00:39.903 に答える