JavaでCOMの引数に配列を指定する2014年11月23日 19:41

この記事は、10月22日の「Perl,Ruby,PythonでCOMの引数に配列を指定する」の続きです。(我ながら執念深いなあ〜〜〜。)

今回は、JACOB(Java COM Bridge)を利用して、Javaで試してみました。

10,11,14,15行目でSafeArrayに適当な領域を確保した後ダミーの文字を設定していますが、こうしないと「Can't get code pointer error」と怒られてしまいます。
実行結果の通り、現在のバージョンでは配列が逆さまの順に返ってきます。銘柄コードが入る筈の配列に銘柄名、銘柄名が入る筈の配列に銘柄コードが入っています。
しかし、それを前提にコードを書けば良いのだから、私としては別に困るわけではありません。そのうち、開発チームが直してくれるでしょう。

jdk1.8.0_25と、jacob-1.18-M2で確認しました。
 1 import com.jacob.activeX.ActiveXComponent;
 2 import com.jacob.com.Dispatch;
 3 import com.jacob.com.SafeArray;
 4 import com.jacob.com.Variant;
 5 
 6 public class Win32Test {
 7 
 8 	public static void main(String[] args) {
 9 		ActiveXComponent am_names = new ActiveXComponent("ActiveMarket.Names.1");
10 		SafeArray codes = new SafeArray(Variant.VariantString, 4);
11 		codes.setString(0, "");
12 		Variant vn1 = new Variant(Variant.VariantArray, true);
13 		vn1.putSafeArrayRef(codes);
14 		SafeArray names = new SafeArray(Variant.VariantString, 4);
15 		names.setString(0, "");
16 		Variant vn2 = new Variant(Variant.VariantArray, true);
17 		vn2.putSafeArrayRef(names);
18 		Dispatch.call(am_names, "AllNames", 3, vn1, vn2);
19 		int codes_lower = codes.getLBound();
20 		System.out.println("codes getLBound()=" + codes_lower);
21 		int codes_upper = codes.getUBound();
22 		System.out.println("codes getUBound()=" + codes_upper);
23 		int names_lower = names.getLBound();
24 		System.out.println("names getLBound()=" + names_lower);
25 		int names_upper = names.getUBound();
26 		System.out.println("names getUBound()=" + names_upper);
27 		System.out.println("codes[" + codes_lower + "]=" + codes.getString(codes_lower));
28 		System.out.println("codes[" + codes_upper + "]=" + codes.getString(codes_upper));
29 		System.out.println("names[" + names_lower + "]=" + names.getString(names_lower));
30 		System.out.println("names[" + names_upper + "]=" + names.getString(names_upper));
31 	}
32 }

[実行結果]
 1 Microsoft Windows [Version 6.1.7601]
 2 Copyright (c) 2009 Microsoft Corporation.  All rights reserved.
 3 
 4 C:\Users\superich>cd /d c:\Temp
 5 
 6 c:\Temp>set classpath=.;c:\usr\jacob-1.18-M2\jacob.jar
 7 
 8 c:\Temp>set path=%path%c:\usr\jacob-1.18-M2;
 9 
10 c:\Temp>c:\Java\jdk1.8.0_25\bin\javac.exe Win32Test.java
11 
12 c:\Temp>c:\Java\jdk1.8.0_25\bin\java.exe Win32Test
13 codes getLBound()=1
14 codes getUBound()=5337
15 names getLBound()=1
16 names getUBound()=5337
17 codes[1]=東京IOM一般大豆
18 codes[5337]=ベルーナ
19 names[1]=501
20 names[5337]=9997
21 
22 c:\Temp>

コメント

トラックバック