class WIN32OLE_VARIANT

[edit]

要約

OLEオートメーションの標準型のVARIANTオブジェクトをRubyで利用するためのクラスです。

VARIANT型とは、型情報と値のペアから構成されるデータ型で、元はVBの型無し変数のための構造体です。OLEオートメーションのメソッド呼び出しには汎用型として引数にはVARIANT型を利用します。

OLEオートメーションのメソッド呼び出し規約では、引数はVARIANT型の配列として定義されています。

この規約に対して、WIN32OLEでは、VARIANT型の値に対する参照を引数配列の各要素に設定します。この実装は、ほとんどのOLEオートメーションサーバで正しく処理されます。

しかし、一部のOLEオートメーションサーバは、引数配列の要素にVARIANT型の値そのものを要求します。この場合、WIN32OLEの実装は正しく処理されません。

WIN32OLE_VARIANTオブジェクトを利用すると、このようなOLEオートメーションサーバのメソッド呼び出しに対して、VARIANT型の値を引数配列に設定することをWIN32OLEへ指示できます。

なお、WIN32OLE_VARIANTを利用する必要の有無は、呼び出し対象のOLEオートメーションサーバの仕様または実装に依存します。

サンプルコード

shell = WIN32OLE.new('Shell.Application')
folder = shell.NameSpace('C:\\Users\\Public\\Documents')
item = folder.ParseName('test.txt')
v = WIN32OLE_VARIANT.new('Delete')
item.invokeVerb(v)     # => ゴミ箱への移動ダイアログを表示

上記サンプルの最後の行を

item.invokeVerb('Delete')

とすると、FolderItemオブジェクトは引数を認識できず、既定の動作として Openを実行します。

プログラムの見た目と異なり、後者のコードに対してWIN32OLEは、'Delete'という文字列を格納したVARIANT型への参照を引数として与えるためです。それに対して前者では、'Delete'という文字列を格納したVARIANT型を引数として与えます。

目次

特異メソッド
インスタンスメソッド
定数

特異メソッド

array(dims, vt) -> WIN32OLE_VARIANT[permalink][rdoc][edit]

配列用のVARIANTオブジェクトを生成します。

オートメーションメソッド呼び出し用の配列を生成します。なお、OLEオートメーションの配列の次元と添え字の関係はVB型だという点に注意してください。これはCと逆順の並びです。

[PARAM] dims:
各次元の要素数を示す配列を与えます。たとえば4要素のベクターであれば[4]、各3要素の2次元配列であれば[3, 3]とします。
[PARAM] vt:
配列要素の型をWIN32OLE::VARIANTの定数で指定します。
[RETURN]
指定された次元/要素数を持つWIN32OLE_VARIANTオブジェクト。

次の例は、最初の次元が3要素、次の次元が4要素の2次元配列を生成する例です。

ole_ary = WIN32OLE_VARIANT.array([3,4], WIN32OLE::VARIANT::VT_I4)
ruby_ary = ole_ary.value # => [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

[SEE_ALSO] WIN32OLE_VARIANT#value, WIN32OLE::VARIANT

new(val, vartype = nil) -> WIN32OLE_VARIANT[permalink][rdoc][edit]

指定したオブジェクトを値とするWIN32OLE_VARIANTオブジェクトを生成します。

[PARAM] val:
ラップするRubyオブジェクトを指定します。
[PARAM] vartype:
省略時はWIN32OLEが自動型変換を行います。指定する場合は WIN32OLE::VARIANTの定数を指定してください。
[RETURN]
val引数を値として持つWIN32OLE_VARIANTオブジェクトを返します。
[EXCEPTION] TypeError:
val引数の型がArray、String、Integer、Float、Time、 WIN32OLE、WIN32OLE_VARIANT、TrueClass、FalseClass、 NilClass のいずれでもありません。
shell = WIN32OLE.new('Shell.Application')
folder = shell.NameSpace('C:\\Users\\Public\\Documents')
item = folder.ParseName('test.txt')
v = WIN32OLE_VARIANT.new('Delete')
item.invokeVerb(v)     # => ゴミ箱への移動ダイアログを表示

バイト配列を生成するには、以下のようにvartype引数にVT_UI1 | VT_ARRAYを設定します。バイト配列の値のRuby表現はエンコーディングをASCII-8BITに設定した文字列となります。

include WIN32OLE::VARIANT
bytes = WIN32OLE_VARIANT.new([1,2,3,4,5], VT_UI1 | VT_ARRAY)
bytes.value          #=> "\x01\x02\x03\x04\x05"
bytes.value.encoding #=> #<Encoding:ASCII-8BIT>

[SEE_ALSO] WIN32OLE::VARIANT

インスタンスメソッド

self[i...] -> object[permalink][rdoc][edit]

配列型のWIN32OLE_VARIANTの要素を取得します。

selfは、WIN32OLE_VARIANT.arrayまたは引数に配列を指定して WIN32OLE_VARIANT.newで作成したインスタンスの必要があります。

[PARAM] i:
各次元の0からのインデックスを「,」で区切って次元数分指定します。インデックスは0から要素数-1までのIntegerで指定してください。
[RETURN]
引数で指定したインデックスの要素を返します。
[EXCEPTION] ArgError:
引数の数が次元数と一致していません。
[EXCEPTION] WIN32OLERuntimeError:
selfが配列型のWIN32OLE_VARIANTではありません。あるいはインデックスが0未満または要素数以上を指定しています。
obj = WIN32OLE_VARIANT.new([[1,2,3],[4,5,6]])
p obj[0,0] # => 1
p obj[1,0] # => 4
p obj[2,0] # => WIN32OLERuntimeError
p obj[0, -1] # => WIN32OLERuntimeError
self[i...] = val[permalink][rdoc][edit]

配列型のWIN32OLE_VARIANTの要素を設定します。

selfは、WIN32OLE_VARIANT.arrayまたは引数に配列を指定して WIN32OLE_VARIANT.newで作成したインスタンスの必要があります。

[PARAM] i:
各次元の0からのインデックスを「,」で区切って次元数分指定します。インデックスは0から要素数-1までのIntegerで指定してください。
[PARAM] val:
設定値を指定します。Array、String、Integer、Float、 TrueClass、FalseClass、NilClass以外のオブジェクトはオートメーションオブジェクト(WIN32OLEオブジェクト)に変換します。
[RETURN]
引数で指定したインデックスの要素を返します。
[EXCEPTION] ArgError:
引数の数が次元数と一致していません。
[EXCEPTION] WIN32OLERuntimeError:
selfが配列型のWIN32OLE_VARIANTではありません。あるいはインデックスが0未満または要素数以上を指定しています。
obj = WIN32OLE_VARIANT.new([[1,2,3],[4,5,6]])
obj[0,0] = 7
obj[1,0] = 8
p obj.value # => [[7,2,3], [8,5,6]]
obj[2,0] = 9 # => WIN32OLERuntimeError
obj[0, -1] = 9 # => WIN32OLERuntimeError
value -> object[permalink][rdoc][edit]

値に対応するRubyオブジェクトを取得します。

[RETURN]
値に対応するRubyのオブジェクトを返します。
obj = WIN32OLE_VARIANT.new(1, WIN32OLE::VARIANT::VT_BSTR)
obj.value # => "1" (VT_BSTRを指定して生成したので、Stringオブジェクトとなる)
value=(val) -> ()[permalink][rdoc][edit]

WIN32OLE_VARIANTの値を再設定します。

指定した値でselfを再設定します。指定値が元のVARIANT型に合わない場合は元のVARIANT型に合うように引数を変換します。変換は、引数を一度VARIANT型に変換してからCOMのVARIANT型変換関数(VariantChangeTypeEx)を呼び出すことで実現します。

[PARAM] val:
設定値を指定します。
[EXCEPTION] WIN32OLERuntimeError:
selfが配列型です。あるいは、型変換に失敗しました。
obj = WIN32OLE_VARIANT.new(1) # VARIANT型にWIN32OLE::VARIANT::VT_I4を設定
obj.value = 3.2      # 3.2から新たなVARIANT型を作成し、それをVT_I4に変換
p obj.value # => 3   # VT_I4に変換した結果が設定される

selfが配列型のWIN32OLE_VARIANTの場合、バイト配列かつ引数が文字列の場合を除いてWIN32OLERuntimeErrorを通知します。配列型の場合は、 WIN32OLE_VARIANT#[]=を利用してください。

vartype -> Integer[permalink][rdoc][edit]

selfの型情報を取得します。

型情報は、WIN32OLE::VARIANTの定数値の組み合わせです。

obj = WIN32OLE_VARIANT.new("string")
obj.vartype   # => 8 (WIN32OLE::VARIANT::VT_BSTR)
bytes = WIN32OLE_VARIANT.new([1,2,3,4,5], VT_UI1 | VT_ARRAY)
bytes.vartype # => 8209 (WIN32OLE::VARIANT::VT_ARRAY | VT_UI1)

定数

Empty -> WIN32OLE_VARIANT[permalink][rdoc][edit]

EMPTY型のWIN32OLE_VARIANTオブジェクトです。

このオブジェクトは、VOID型の戻り値や、値が空なことを明示しなければならない特殊な引数に利用します。

[SEE_ALSO] WIN32OLE::VARIANT::VT_EMPTY

Nothing -> WIN32OLE_VARIANT[permalink][rdoc][edit]

DISPATCH型の空のオブジェクトです。

[SEE_ALSO] WIN32OLE::VARIANT::VT_DISPATCH

Null -> WIN32OLE_VARIANT[permalink][rdoc][edit]

NULL型のWIN32OLE_VARIANTオブジェクトです。

このオブジェクトは、ADOなどのデータベースインターフェイスでNULLを指定するのに利用可能です。

[SEE_ALSO] WIN32OLE::VARIANT::VT_NULL