インストール方法
jcom2xx.zipを解凍して下さい。(xxはバージョンにより異なります)
JComにはjcom.jarとjcom.dllの2つのファイルが必要です。
jcom.jar は (java-home)/lib/ext/ 、およびCLASSPATHで設定したディレクトリの下のlib/ext/に入れて下さい。
jcom.dll は (java-home)/bin/ に入れて下さい。
(java-home)は、java.lang.System.getProperty("java.home"); で
知ることが出来ます。
技術情報
サポートしているVARIANT型
サポートしているVARIANT型を以下に示します。
推奨する型はVT_I4, VT_R8, VT_BOOL, VT_BSTR, VT_DISPATCH です。
新規にCOMを作成する場合は、他の型よりこれらの型を使うことを勧めます。
Visual-BasicとJavaとの対応表
Visual-BasicとJavaとの変数の型の対応を示します。
以下の型についてのみ利用することができます。
| COM |
Java |
Visual-BASIC |
| VT_UI1 |
java.lang.Byte |
ByVal As Byte |
| VT_I2 |
java.lang.Short |
ByVal As Integer |
| VT_I4 |
java.lang.Integer |
ByVal As Long |
| VT_R4 |
java.lang.Float |
ByVal As Single |
| VT_R8 |
java.lang.Double |
ByVal As Double |
| VT_BOOL |
java.lang.Boolean |
ByVal As Boolean |
| VT_BSTR |
java.lang.String |
ByVal As String |
| VT_DATE |
java.util.Date |
ByVal As Date |
| VT_CY |
jp.ne.so_net.ga2.no_ji.jcom.VariantCurrency |
ByVal As Currency |
| VT_UNKNOWN |
jp.ne.so_net.ga2.no_ji.jcom.IUnknown |
? |
| VT_DISPATCH |
jp.ne.so_net.ga2.no_ji.jcom.IDispatch |
? |
| VT_UI1|VT_BYREF |
byte[] |
ByRef As Byte |
| VT_I2|VT_BYREF |
short[] |
ByRef As Integer |
| VT_I4|VT_BYREF |
int[] |
ByRef As Long |
| VT_R4|VT_BYREF |
float[] |
ByRef As Single |
| VT_R8|VT_BYREF |
double[] |
ByRef As Double |
| VT_BOOL|VT_BYREF |
boolean[] |
ByRef As Boolean |
| VT_BSTR|VT_BYREF |
java.lang.String[] |
ByRef As String |
サンプル。
Visual-BASIC側のソース
Function foo(ByVal no As Long, ByRef str As String) As Long
...
End Function
Java側のソース
ReleaseManager rm = new ReleaseManager();
try {
IDispatch app = new IDispatch(rm, "Project1.Class1");
Integer no = new Integer(4);
String[] str = new String[1];
str[0] = "文字列";
Object[] param = new Object[] { no, str };
Integer retcode = (Integer)app.method( "foo", param );
}
catch ( Exception e ) {
e.printStackTrace();
}
finally {
rm.release();
}
日付型について
JavaのDateの定義は次のとおりです。
number of milliseconds since January 1, 1970, 00:00:00 GMT
一方、COMのDATEはdoubleで管理されており、1日=1.0です。基準となる日時は
次のとおりで、ロケールの概念がありません。
1899 年 12 月 30 日午前零時 0.00
1900 年 1 月 1 日午前零時 2.00
基準となる日時も違いますし、型や精度も違います。
すなわちJavaのDateは国際化に対応していますが、
COMのDATEは現地時間のみしかないので、ロケール情報がないと、
その時間が一体どこの時間かがわかりません。
JComでは、COMのDATEを現地時間とみなして変換しています。
Unix/Linux から COM を実行できるか?
Unix/Linuxの上ではCOMは動かないので、下記のような構成にすれば動かすことができます。
しかし、ドライバについても作成しなければならないので、面倒です。