WIN32OLEまとめ

返値を受け取りたいときは_invokeをコールしてWIN32OLE::ARGVで返値を受け取ることになっている*1が、ole_methodするとエラーメッセージを吐いてくれる場合がある。

foo.rb:6:in `ole_method': failed to GetTypeInfo (RuntimeError)
    HRESULT error code:0x80004001
      実装されていません
        from foo.rb:6

こんな時は、WIN32OLE Viewなどでdispatch IDを自分で調べて、直書きするしかない。

win32ole._invoke(20091, [1, 1, 00], \
  [VT_I4, VT_I4, VT_R8|VT_BYREF, VT_VARIANT|VT_BYREF])
p WIN32OLE::ARGV

それでも言うことを聞かない場合は、WIN32OLE Viewで引数、返値の型を調べ直す。APIドキュメントが間違っている場合がある。VT_R8|VT_ARRAYと書いてあるのを信じていたけど、実はVT_VARIANTだった。

foo.rb:23:in `_invoke': not valid value (TypeError)
        from foo.rb:23:in `<main>'

ここまでたどり着くのに、だいぶかかってしまった。これでやっと仕事?(内職)が進む。

*1:Rubyist Magazine - Win32OLE 活用法 【第 6 回】 Web 自動巡回 http://jp.rubyist.net/magazine/?0008-win32ole