$codes_ref = $codes[0];
13 my ($codes_first_ix, $codes_last_ix) = (${$codes_ref}[0], ${$codes_ref}[1]);
14 my $names_ref = $names[0];
15 my ($names_first_ix, $names_last_ix) = (${$names_ref}[0], ${$names_ref}[1]);
16 say 'codes[', $codes_first_ix, ']=', $v1->Get($codes_first_ix);
17 say 'codes[', $codes_last_ix, ']=', $v1->Get($codes_last_ix);
18 say 'names[', $names_first_ix, ']=', $v2->Get($names_first_ix);
19 say 'names[', $names_last_ix, ']=', $v2->Get($names_last_ix);
実行結果(Perl v5.20.1 で確認)
codes[1]=501
codes[5323]=9997
names[1]=東京IOM一般大豆
names[5323]=ベルーナ
7,8行目で配列の領域を設定していますが、my $v1 = Variant(VT_ARRAY|VT_BSTR|VT_BYREF, 0); としても問題ないようです。このデータベースは日々更新されるのでデータ件数があらかじめ分からないし、COMの側で初期化するので取り敢えず領域を設定しておく必要はないかもしれません。
10,11行目のDimメソッドで取得する配列には、先頭・最終インデックスが格納されています。実際には、この例では([1,5323],)のリストで、[1,5323]が格納された配列のリファレンスが格納されています。
Rubyの場合
1 require 'win32ole'
2 include WIN32OLE::VARIANT
3 an = WIN32OLE.new('ActiveMarket.Names.1')
4 codes = WIN32OLE_VARIANT.array([4], VT_ARRAY|