COMの引数に配列を指定する方法を調べていたところ、日本語の情報があまり多くはないように感じたので、自分自身のメモ代わりにも書いておきます。
私が使っているCOMは、パンローリング株式会社の提供している'Pan Active Market Database'(http://www.panrolling.com/pansoft/amarket/)というものです。
宣伝ではないので、製品の詳しい説明はしません。興味のある方はサイトを覗いてみてください。
例として取り上げるクラス、メソッドは次のとおりです。
この例では、配列に値をセットしてCOMに渡すのではなく、COMの側で配列を初期化して値をセットして戻してきます。
ProgIDは、'ActiveMarket.Names.1'です。
Names(名前)クラス --> 銘柄コードと銘柄名との対応を保持するクラス
AllNamesメソッド --> 種類を指定して、銘柄コードと銘柄名の一覧を取得するメソッド
形式
Sub AllNames(ByVal Kind As KindFlag, Codes() As String, Names() As String)
Enum KindFlag
AM_KINDFLAG_SPOTS = 1
AM_KINDFLAG_FUTURES = 2
AM_KINDFLAG_ALL = 3
End Enum
引数
Kind 入力 取得する種類 (AM_KINDFLAG_SPOTS: 現物、AM_KINDFLAG_FUTURES: 先物、AM_KINDFLAG_ALL: すべて)
Codes 出力 銘柄コードの一覧
Names 出力 銘柄名の一覧
戻り値 ナシ
マニュアルではVB6のコードで説明されていますが、実装がVB6かどうかは分かりません。
Perlの場合
1 use strict;
2 use warnings;
3 use Win32::OLE;
4 use Win32::OLE::Variant;
5 use 5.010;
6 my $nm = Win32::OLE->new('ActiveMarket.Names.1');
7 my $v1 = Variant(VT_ARRAY|VT_BSTR|VT_BYREF, [1,2], 1);
8 my $v2 = Variant(VT_ARRAY|VT_BSTR|VT_BYREF, [1,2], 1);
9 $nm->AllNames(3, $v1, $v2);
10 my @codes = $v1->Dim();
11 my @names = $v2->Dim();
12 my