[Ruby] Win32OLEの1.8と1.9の違い(その3)
4. WIN32OLE_VARIANTクラスが追加された。
Win32OLEがOLEサーバー側の関数(メソッド)を実行するときに引数はすべて参照渡しで実行するようになってます。
ですが、値渡しを要求する関数(メソッド)も存在します。
そのとき、WIN32OLE_VARIANTクラスを使うことができます。
fso = WIN32OLE.new("Scripting.FileSystemObject")
shell = WIN32OLE.new("Shell.Application")
folder = shell.NameSpace(fso.getFolder(".").path)
item = folder.ParseName("temp.txt")
shortcut = WIN32OLE_VARIANT.new("ショートカットの作成(&S)")
item.invokeVerb(shortcut) # shortcutは値渡し
WIN32OLE_VARIANT.new メソッドは第二引数にVT_XXXを指定して、指定した型のWIN32OLE_VARIANTオブジェクトを生成することができます。
たとえば、Win32OLEは、デフォルトで文字列をVT_BSTR型に変換しますが、バイナリデータをそのままOLEサーバーの関数(メソッド)に
引数として渡したいときに困ります。1.8では、_invokeを使う方法が提供されていました。
1.9では、従来の方法の他、WIN32OLE_VARIANT.newメソッドを使う方法があります。
bdata = WIN32OLE_VARIANT.new(bstring,
WIN32OLE::VARIANT::VT_UI1|WIN32OLE::VARIANT::VT_ARRAY)
として bstringの代わりにbdataを引数として使うことによってバイナリデータをそのまま渡すことができます。
1.9で Encoding が ASCII-8BIT ならバイナリだと見なしてよいのではないかという議論がありました。
今のところ、Win32OLEでは、Encoding が ASCII-8BIT な文字列が渡されてもバイナリという判断はしません。
VT_BSTR型に変換します。
ASCII-8BIT の String をバイナリとして扱いたいときも、明示的に WIN32OLE_VARIANT.new を使ってください。
| 固定リンク
この記事へのコメントは終了しました。
コメント