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で確認しました。
[実行結果]
今回は、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>
最近のコメント