タイプライブラリから配列を受け取る方法

WIN32OLE を使ってタイプライブラリから配列を受け取りたい。

配列を retval で返してくれる関数なら、Ruby からそのまま Enumerable として扱える。

ole_object.func(arg1, arg2).each do |value|
  # func が返した配列を順番に処理
end


ところが、関数に渡された引数に配列を詰めて返してくれたりするイケてないタイプライブラリが存在する。

ole_object.gunc(array)  # => true  # 成功したらしい
array                   # => nil   # なぜ?

素直に実行しても配列を返してくれない。

そんなときは WIN32OLE::ARGV を使う。

ole_object.gunc(array)
array = WIN32OLE::ARGV[0]   # gunc の 0 番目の引数

array.each do |value|
  # gunc が返した配列を順番に処理
end

VARIANT の配列も問題なし。
二次元配列は Array を要素とする Array として扱える。

ところが VARIANT 配列を要素とする VARIANT 配列を返されると、うまく扱えないみたい。*1
Array#flatten されたような状態になってしまう。惜しい。

*1:推測。本当は何が返ってきてるのか不明。