バリアント型(COM)

バリアント型は、 Visual BasicOCaml[1] 、 DelphiC++などの特定のプログラミング言語において、コンポーネントオブジェクトモデル(COM)を使用する際に用いられるデータ型です。これは、コンピュータサイエンスにおける同名のコンセプトの実装です

Visual Basic(およびVisual Basic for Applications)では、バリアント型はタグ付き共用体であり、固定長文字列型を除くあらゆるデータ型(整数浮動小数点単精度および倍精度オブジェクトなど)を表すために使用できます。Visual Basicでは、明示的に宣言されていない変数、または型が明示的に宣言されていない変数はすべてバリアント型とみなされます。

明示的に宣言されていないバリアントの使用は推奨されませんが、必要なデータ型が実行時にのみ判明する場合、データ型が変化すると予想される場合、あるいはオプションのパラメータやパラメータ配列が必要な場合には、バリアントが有用です。実際、動的型システムを備えた言語では、変数に使用できる型としてバリアントが唯一存在することがよくあります。

Visual Basic .NETにおける主要な変更点の一つとして、.NET 言語であるという事実が挙げられます。バリアント型は .NETオブジェクト型に置き換えられました。概念的には類似点がありますが、大きな違いもあり、これら 2 つの型の間には直接的な変換は存在しません。Visual Basic .NET コードが Visual Basic 6 COM オブジェクトとやり取りする際に必要となる可能性のある変換については、通常は.NET マーシャリング を使用します。

Visual Basic では、A という名前のバリアントを明示的または暗黙的に宣言できます。

Dim A Dim Aバリエーション    

Delphiでは、 A という名前のバリアントは次のように宣言されます。

var A :バリアント;  

フォーマット

Visual Basicで定義されているバリアント型変数(略して「バリアント」と呼ばれます)は、16バイトの記憶域を必要とし、そのレイアウトは次のとおりです

オフセットサイズ説明
02VarType によって返される値は、バリアントに含まれるデータの種類を指定します。
26予約バイト。VT_DECIMAL型のみに使用されます。
8最大8バリアントに含まれるデータ。

Visual Basicで遭遇する可能性のあるバリアントの例をいくつか示します。他の言語では、他の種類のバリアントも使用できます

変数型16進数プロパバリアント型プロパバリアントメンバー型名データバイトCおよびC++型
00x00VT_EMPTYなし1
10x01VT_NULLなしヌル2
20x02VT_I2iVal整数2A00ショート
30x03VT_I4lValロング2A000000ロング
40x04VT_R4浮動小数点値単一00002842浮動小数点数
50x05VT_R8ダブル値ダブル0000000000004540ダブル
60x06VT_CYcyVal通貨A068060000000000CY構造
70x07VT_DATE日付日付00000000C0D5E140日付(倍精度浮動小数点数)
80x08VT_BSTRbstrVal文字列xxxxxxxx(BSTR):(OLECHAR *):(WCHAR *):( wchar_t *)
90x09VT_DISPATCHpdispVal
100x0aVT_ERRORscodeエラー2A000A80HRESULT (long int)
110x0bVT_BOOLブール値ブール型FFFFVARIANT_BOOL (short)
120x0cVT_VARIANTpvarValバリアントバリアント
130x0dVT_UNKNOWNパンク値なし400000000不明*
140x0eVT_DECIMAL10進数値10進数
160x10VT_I1cValバイト文字
170x11VT_UI1bValバイト2Aバイト(符号なし文字)
180x12VT_UI2uiValワード(符号なしショート)
190x13VT_UI4ulValDWORD (符号なし整数)
200x14VT_I8hVal
210x15VT_UI8uhVal
220x16VT_INT整数値
230x17VT_UINTuintVal
240x18VT_VOID
250x19VT_HRESULT3が見つかりません80020004HRESULT (long int)
260x1aVT_PTR
270x1bVT_SAFEARRAYパラレイ
280x1cVT_CARRAY
290x1dVT_ユーザー定義
300x1eVT_LPSTRpszVal
310x1fVT_LPWSTRpwszVal
360x24VT_RECORD
370x25VT_INT_PTRピン値
380x26VT_UINT_PTRポインタ値
81920x2000VT_ARRAYパラレイ
9オブジェクト参照5xxxxxxxxIUnknown *
  • 1初期化されていないバリアントの型
  • 2データベース内の NULL 値の型。つまり、初期化されておらず、C++ のNULL ポインターと同等ではありません。
  • 3不足している引数は、実際には「パラメータが見つかりません」という特定のエラー値です。
  • 4オブジェクト タイプが null 参照に設定されました。
  • 5 TypeNameは、含まれるオブジェクトのクラス名を返します。データはインターフェースポインタ、つまり仮想メソッドテーブル(関数ポインタの配列)へのポインタへのポインタになります。

一般的な用途

コレクション

OLEオートメーションCollectionのクラスは、異なるデータ型の項目を格納できます。これらの項目のデータ型はコンパイル時に不明であるため、コレクションに項目を追加したり、コレクションから項目を取得したりするメソッドではバリアントを使用します。Visual Basicでこの構造を使用する場合、反復子変数はオブジェクト型またはバリアント型でなければなりませんFor Each

ディスパッチメソッド呼び出し

OLEオートメーションでは、IDispatchオブジェクトのクラスを事前に知ることができない場合にインターフェースが使用されます。したがって、そのようなオブジェクトのメソッドを呼び出す場合、引数と戻り値の型はコンパイル時にはわかりません。引数はバリアントの配列として渡され、呼び出しが完了するとバリアントが返されます

オプションパラメータ

Visual Basicでは、プロシージャの引数にキーワードを接頭辞として付けることで、引数を省略可能と宣言できます。引数が省略された場合、Visual Basicは上記の表でMissingOptionalと呼ばれる特別な値をプロシージャに渡します。この値は、引数が欠落していることを示します。この値は指定値または特別な値のいずれかであるため、バリアントを使用する必要があります。

Function GetText ( Optional ByVal Index ) As String If IsMissing ( Index ) Then GetText = Item ( CurrentItem ) Else GetText = Item ( Index ) End If End Function                  

同様に、キーワードをParamArray使用して、後続のすべての引数をバリアント配列で渡すこともできます。

参照

参照

  1. ^ “第6章 バリアント / Real World OCaml”. v1.realworldocaml.org . 2019年5月8日時点のオリジナルよりアーカイブ。
  • C++ Boost.Variant
  • https://msdn.microsoft.com/en-ca/library/cc237865.aspx
  • https://msdn.microsoft.com/en-us/library/windows/desktop/aa380072(v=vs.85).aspx
「https://en.wikipedia.org/w/index.php?title=Variant_type_(COM)&oldid=1300930243」より取得