サポートされる COM データ型とそれらに相当する Java データ型
WebLogic jCOM は、すべての COM Automation 型をサポートしています。BEA は、新しい Java クラスを導入せずに COM 型にアクセスすることを方針としました。このため、COM Variant は Object(java.lang.Long など)にマップされ、配列を含む Variant は Java 配列にマップされます。たとえば、使用する必要がある com.bea.jcom.Variant クラスは見つかりません。
WebLogic jCOM は、Java コレクション型に Visual Basic Collection としてアクセスすることをサポートしています。
この章では、以下のことを説明します。
- Java オブジェクトへの Visual Basic Collection としてのアクセス
- COM IDL 型の Java、および VC++ へのマップ
- 異なる型を含む COM Variant の Java へのマップ
- COM から Java へのレイトバインド アクセス中に使用される型変換
- Java から COM VariantEnums へのアクセス
Java オブジェクトへの Visual Basic Collection としてのアクセス
Visual Basic には、Collection というクラスがあらかじめ用意されています。WebLogic jCOM は、java.util.Vector および java.util.List のインスタンスに VB Collection としてアクセスすることをサポートしています。
Visual BASIC コードの例
Private Sub Form_Load()
Dim c As Collection
Set c = GetObject("firstjvm:java.util.LinkedList")
c.Add "hello" ' List is now: "hello"
c.Add Now, , "hello" ' List is now: , "hello"
c.Add "Goodbye", , , "hello" ' List is now: now, "hello", "Goodbye" c.Add "Before", , 3 ' List is now: now, "hello", "Before", "Goodbye" c.Add "After", , , 4 ' List is now: now, "hello", "Before", "Goodbye", "After"
For Each e In c
MsgBox e
Next
c.Remove 2 ' List is now: now, "Before", "Goodbye", "After"
c.Remove "Goodbye" ' List is now: now, "Before", "After"
MsgBox c.Item(1)
MsgBox c.Count
End Sub
VB
|
java.util.Vector へのマップ
|
注意
|
Collection.Add(item)
|
aVector.addElement(item)
|
|
Collection.Add(item, , before)
|
aVector.insertElementAt(before - 1, item)
|
before が数字の場合。
|
Collection.Add(item, , before)
|
aVector.insertElementAt(aVector.indexOf(before), item)
|
before が数字でない場合。
|
Collection.Add(item, , , after)
|
aVector.insertElementAt(after, item)
|
after が数字でない場合。
|
Collection.Add(item, , , after)
|
aVector.insertElementAt(aVector.indexOf(after) + 1, item)
|
after が数字の場合。
|
Collection.Count
|
aVector.size()
|
|
Collection.Item(index)
|
aVector.elementAt(index - 1)
|
index は数字でなければならない。
|
Collection.Remove(index)
|
aVector.removeElementAt(index - 1)
|
index が数字の場合。
|
Collection.Remove(index)
|
aVector.removeElement(index)
|
index が数字でない場合。
|
aCollection 中の各 x
|
x は aVector.elements() 列挙内の各オブジェクトの値を取る。
|
|
VB
|
java.util.List へのマップ
|
注意
|
Collection.Add(item)
|
aList.target.add(item)
|
|
Collection.Add(item, , before)
|
aList.add(before - 1, item)
|
before が数字の場合。
|
Collection.Add(item, , before)
|
aList.add(aVector.indexOf(before), item)
|
before が数字でない場合。
|
Collection.Add(item, , , after)
|
aList.add(after, item)
|
after が数字でない場合。
|
Collection.Add(item, , , after)
|
aList.add(aVector.indexOf(after) + 1, item)
|
after が数字の場合。
|
Collection.Count
|
aList.size()
|
|
Collection.Item(index)
|
aList.get(index - 1)
|
index は数字でなければならない。
|
Collection.Remove(index)
|
aList.remove(index - 1)
|
index が数字の場合。
|
Collection.Remove(index)
|
aList.remove(index)
|
index が数字でない場合。
|
aCollection 中の各 x
|
x は aList.listIterator() イテレータ内の各オブジェクトの値を取る。
|
|
COM IDL 型の Java、VB、および VC++ へのマップ
次の表に、各 IDL 型と、Java、Visual BASIC、および Visual C++ からのその使い方を示します。
表7-1
IDL
|
Java
|
Visual BASIC
|
Visual C++
|
[in] VARIANT_BOOL
|
boolean
|
ByVal boolean
|
VARIANT_BOOL
|
[in, out] または [out] VARIANT_BOOL*
|
boolean[] 単一要素配列
|
boolean
|
VARIANT_BOOL*
|
[in] unsigned char
|
byte
|
ByVal byte
|
unsigned char
|
[in, out] または [out] unsigned char*
|
byte[] 単一要素配列
|
byte
|
unsigned char*
|
[in] double
|
double
|
ByVal Double
|
double
|
[in, out] または [out] double*
|
double[] 単一要素配列
|
double
|
double*
|
[in] float
|
float
|
ByVal Single
|
float
|
[in, out] または [out] float*
|
float[] 単一要素配列
|
Single
|
float*
|
[in] long
|
int IDL long は 32 ビット
|
ByVal Long>
|
long>
|
[in, out] または [out] long*
|
int[] 単一要素配列
|
Long>
|
long*
|
[in] short
|
short
|
ByVal Integer>
|
short>
|
[in, out] または [out] short*
|
short[] 単一要素配列
|
Integer
|
short*
|
[in] BSTR
|
java.lang.String
|
ByVal Single
|
BSTR
|
[in, out] または [out] BSTR*
|
java.lang.String[] 単一要素配列
|
String
|
BSTR*
|
[in] CY
|
long CY は固定小数点、64 ビット
|
ByVal Currency
|
CURRENCY
|
[in, out] または [out] CY*
|
long[] 単一要素配列
|
Currency
|
CURRENCY*
|
[in] DATE
|
java.util.Date
|
ByVal Date
|
DATE
|
[in, out] または [out] DATE*
|
java.util.Date[]
|
Date
|
DATE*
|
[in] IDispatch*
|
java.lang.Object
|
ByVal Object
|
IDispatch*
|
[in, out] または [out] IDispatch**
|
java.lang.Object[] 単一要素配列
|
Object
|
IDispatch**
|
[in] ISomeInterface*
|
ISomeInterface 生成される Java インタフェース
|
ByVal ISomeInterface
|
ISomeInterface*
|
[in, out] または [out] ISomeInterface**
|
ISomeInterface[] 単一要素配列
|
ISomeInterface
|
ISomeInterface**
|
[in] SomeClass*
|
SomeClass 生成される Java クラス
|
ByVal SomeClass
|
SomeClass*
|
[in, out] または [out] SomeClass**
|
SomeClass[] 単一要素配列
|
SomeClass
|
SomeClass**
|
[in] IUnknown*
|
java.lang.Object
|
特定のクラス/インタフェース
|
IUnknown*
|
[in] Variant
|
java.lang.Object
|
ByVal Variant
|
VARIANT
|
[in, out] または [out] Variant*
|
java.lang.Object[] 単一要素配列
|
Variant
|
VARIANT*
|
[in] SAFEARRAY(unsigned char)
|
byte[]
|
VB ではサポートされない
|
SAFEARRAY*
|
[in, out] または [out] SAFEARRAY(unsigned char)*
|
byte[][]
|
VB ではサポートされない
|
SAFEARRAY**
|
[in] SAFEARRAY(VARIANT_BOOL)
|
boolean[]
|
VB ではサポートされない
|
SAFEARRAY*
|
[in, out] または [out] SAFEARRAY(VARIANT_BOOL)*
|
boolean[][]
|
VB ではサポートされない
|
SAFEARRAY**
|
[in] SAFEARRAY(short)
|
short[]
|
VB ではサポートされない
|
SAFEARRAY*
|
[in, out] または [out] SAFEARRAY(short)*
|
short[][]
|
VB ではサポートされない
|
SAFEARRAY**
|
[in] SAFEARRAY(long)
|
int[]
|
VB ではサポートされない
|
SAFEARRAY*
|
[in, out] または [out] SAFEARRAY(long)*
|
int[][]
|
VB ではサポートされない
|
SAFEARRAY**
|
[in] SAFEARRAY(float)
|
float[]
|
VB ではサポートされない
|
SAFEARRAY*
|
[in, out] または [out] SAFEARRAY(float)*
|
float[][]
|
VB ではサポートされない
|
SAFEARRAY**
|
[in] SAFEARRAY(double)
|
double[]
|
VB ではサポートされない
|
SAFEARRAY*
|
[in, out] または [out] SAFEARRAY(double)*
|
double[][]
|
VB ではサポートされない
|
SAFEARRAY**
|
[in] SAFEARRAY(CURRENCY)
|
long[]
|
VB ではサポートされない
|
SAFEARRAY*
|
[in, out] または [out] SAFEARRAY(CURRENCY)*
|
long[][]
|
VB ではサポートされない
|
SAFEARRAY**
|
[in] SAFEARRAY(DATE)
|
java.util.Date[]
|
VB ではサポートされない
|
SAFEARRAY*
|
[in, out] または [out] SAFEARRAY(DATE)*
|
java.util.Date[][]
|
VB ではサポートされない
|
SAFEARRAY**
|
[in] SAFEARRAY(BSTR)
|
String[]
|
VB ではサポートされない
|
SAFEARRAY*
|
[in, out] または [out] SAFEARRAY(BSTR)*
|
String[][]
|
VB ではサポートされない
|
SAFEARRAY**
|
[in] SAFEARRAY(LPDISPATCH)
|
Object[]
|
VB ではサポートされない
|
SAFEARRAY*
|
[in, out] または [out] SAFEARRAY(LPDISPATCH)*
|
Object[][]
|
VB ではサポートされない
|
SAFEARRAY**
|
[in] SAFEARRAY(VARIANT)
|
Object
|
VB ではサポートされない
|
SAFEARRAY*
|
[in, out] または [out] SAFEARRAY(VARIANT)*
|
Object[][]
|
VB ではサポートされない
|
SAFEARRAY**
|
[in] SAFEARRAY(LPUNKNOWN)
|
Object
|
VB ではサポートされない
|
SAFEARRAY*
|
[in, out] または [out] SAFEARRAY(LPUNKNOWN)*
|
Object[][]
|
VB ではサポートされない
|
SAFEARRAY**
|
異なる型を含む COM Variant の Java へのマップ
次の表に、Variant と Java 型のマップを示します。
以下を含む Variant
|
Java 型へのマップ
|
VARIANT_BOOL
|
java.lang.Boolean
|
VARIANT_BOOL*
|
java.lang.Boolean[] 単一要素配列
|
unsigned char
|
java.lang.Byte
|
unsigned char*
|
java.lang.Byte[] 単一要素配列
|
double
|
java.lang.Double
|
double*
|
java.lang.Double[] 単一要素配列
|
float
|
java.lang.Float
|
float*
|
java.lang.Float[] 単一要素配列
|
long
|
java.lang.Integer IDL long は 32 ビット
|
long*
|
java.lang.Integer[] 単一要素配列
|
short
|
java.lang.Short
|
short*
|
java.lang.Short[] 単一要素配列
|
BSTR
|
java.lang.String
|
BSTR*
|
java.lang.String[] 単一要素配列
|
CY
|
java.lang.Long
|
CY*
|
java.lang.Long[] 単一要素配列
|
Decimal
|
java.math.BigDecimal
|
Decimal*
|
java.math.BigDecimal[] 単一要素配列
|
DATE
|
java.util.Date
|
DATE*
|
java.util.Date[]
|
SCODE
|
java.lang.Long
|
SCODE*
|
java.lang.Long[] 単一要素配列
|
IDispatch*
|
java.lang.Object
|
IUnknown*
|
java.lang.Object
|
VARIANT_BOOL の単一次元配列
|
boolean[]
|
unsigned char の 1 次元配列
|
byte[]
|
double の 1 次元配列
|
double[]
|
float の 1 次元配列
|
float[]
|
long の 1 次元配列
|
int[] IDL long は 32 ビット</TD
|
short の 1 次元配列
|
short[]
|
BSTR の 1 次元配列
|
java.lang.String[]
|
CY の 1 次元配列
|
long[]
|
DATE の 1 次元配列
|
java.util.Date[]
|
SCODE の 1 次元配列
|
long[]
|
IDispatch* の 1 次元配列
|
java.lang.Object[]
|
IUnknown* の 1 次元配列
|
java.lang.Object[]
|
Variant の 1 次元配列
|
java.lang.Object[]
|
Variant の 2 次元配列
|
java.lang.Object[][]
|
com.bea.jcom.EmptyVariant.TYPE と com.bea.jcom.NullVariant.TYPE を受け渡すことで、VT_EMPTY または VT_NULL 型の Variant を受け渡すことができます。
COM から Java へのレイトバインド アクセス中に使用される型変換
以下の表に、左欄の VB 型の VB 値「vb」を上欄の Java 型に変換するために使用される Java 式を示します。* が付けられた変換は、Type Mismatch Error を生成する場合があります。
Java boolean、byte、short、および int
Java(右) VB(下)
|
boolean
|
byte
|
short
|
int
|
Boolean
|
自然
|
vb ? 1 : 0
|
vb ? 1 : 0
|
vb ? 1 : 0
|
Byte(0..255)
|
vb != 0
|
new Integer(vb).byteValue()
|
new Integer(vb).shortValue()
|
new Integer(vb).intValue()
|
Integer(16 ビット)
|
vb != 0
|
new Short(vb).byteValue()
|
自然
|
new Short(vb).intValue()
|
Long(32 ビット)
|
vb != 0
|
new Integer(vb).byteValue()
|
new Integer(vb).shortValue()
|
自然
|
Single
|
vb != 0.0F
|
new Float(vb).byteValue()
|
new Float(vb).shortValue()
|
new Float(vb).intValue()
|
Double
|
vb != 0.0
|
new Double(vb).byteValue()
|
new Double(vb).shortValue()
|
new Double(vb).intValue()
|
Currency(64 ビット)
|
vb != 0
|
new Long(vb).byteValue()
|
new Long(vb).shortValue()
|
new Long(vb).intValue()
|
String
|
new Boolean(vb).booleanValue()
|
new Long(vb).byteValue()
|
new Long(vb).shortValue()
|
new Long(vb).intValue()*
|
Date
|
型不一致エラー
|
型不一致エラー
|
型不一致エラー
|
型不一致エラー
|
Object
|
型不一致エラー
|
型不一致エラー
|
型不一致エラー
|
型不一致エラー
|
Variants
|
内容に応じて上記のとおり
|
|
|
|
Java long、char、float、および double
VB/Java
|
long
|
char
|
float
|
double
|
Boolean
|
vb ? 1 : 0
|
vb ?(char)1 :(char)0
|
vb ?1.0F :0.0F
|
vb ? 1.0 : 0.0
|
Byte(0..255)
|
new Integer(vb).longValue()
|
(char)(new Integer(vb).intValue())
|
new Integer(vb).floatValue()
|
new Integer(vb).doubleValue()
|
Integer(16 ビット)
|
new Short(vb).longValue()
|
(char)(new Short(vb).intValue())
|
new Short(vb).floatValue()
|
new Short(vb).doubleValue()
|
Long (32 bit)
|
new Integer(vb).longValue()
|
(char)(new Integer(vb).byteValue())
|
new Integer(vb).floatValue()
|
new Integer(vb).doubleValue()
|
Single
|
new Float(vb).longValue()
|
(char)(new Float(vb).intValue())
|
自然
|
new Float(vb).doubleValue()
|
Double
|
new Double(vb).longValue()
|
(char)(new Double(vb).intValue())
|
new Double(vb).floatValue()
|
自然
|
Currency(64 ビット)
|
自然
|
(char)(new Long(vb).intValue())
|
new Long(vb).floatValue()
|
new Long(vb).doubleValue()
|
String
|
new Long(vb).longValue()
|
(char)(new Long(vb).intValue())
|
new Long(vb).floatValue()
|
new Long(vb).doubleValue()
|
Date
|
型不一致エラー
|
型不一致エラー
|
型不一致エラー
|
型不一致エラー
|
Object
|
エラー
|
エラー
|
エラー
|
エラー
|
Variants
|
内容に応じて上記のとおり
|
|
|
|
Java String、Date、および Object
VB/Java
|
String
|
Date
|
Object
|
Boolean
|
vb + ""
|
エラー
|
new Boolean(vb)
|
Byte(0..255)
|
vb + ""
|
エラー
|
new Byte(vb)
|
Integer (16 ビット)
|
vb + ""
|
エラー
|
new Short(vb)
|
Long (32 bit)
|
vb + ""
|
エラー
|
new Integer(vb)
|
Single
|
vb + ""
|
エラー
|
new Float(vb)
|
Double
|
vb + ""
|
エラー
|
new Double(vb)
|
Currency
|
vb + ""
|
エラー
|
new Long(vb)
|
String
|
自然
|
new Date(vb)
|
vb (as String_
|
Date
|
vb.toString()
|
自然
|
vb (as Date)
|
Object
|
vb.toString
|
エラー
|
vb
|
Variant
|
内容に応じて上記のとおり
|
|
|
配列
Java メソッドが配列のパラメータを持つ場合、そのメソッドに VB パラメータを値で渡すときにエラーが生成されます。値を参照で渡し、型が正確に一致する場合(下表を参照)、Java メソッドは単一要素配列を受け取ります。この単一要素を修正して、対応する VB パラメータを変更できます。配列を渡し、配列の内容の型が正確に一致する場合、Java メソッドは配列を受け取ります。この配列の要素を修正して対応する VB パラメータを変更できます。
Java 型
|
参照渡しの VB の一致
|
boolean[]
|
参照によって渡される Boolean
|
byte[]
|
参照によって渡される Byte
|
short[]
|
参照によって渡される Short
|
int[]
|
参照によって渡される Long
|
long[]
|
参照によって渡される Currency
|
float[]
|
参照によって渡される Single
|
double[]
|
参照によって渡される Double
|
String[]
|
参照によって渡される String
|
java.util.Date[]
|
参照によって渡される Date
|
配列
Java 型
|
一致する VB 型のパラメータ
|
boolean[]
|
Dim anArray(n) as Boolean
|
byte[]
|
Dim anArray(n) as Byte
|
short[]
|
Dim anArray(n) as Short
|
int[]
|
Dim anArray(n) as Long
|
long[]
|
Dim anArray(n) as Currency
|
float[]
|
Dim anArray(n) as Single
|
double[]
|
Dim anArray(n) as Double
|
String[]
|
Dim anArray(n) as String
|
java.util.Date[]
|
Dim anArray(n) as Date
|
Object[]
|
Dim anArray(n) as String
|
Object[]
|
Dim anArray(n) as Date
|
Object[]
|
Dim anArray(n) as Object
|
Object[]
|
Dim anArray(n) as Variant
|
Java から COM VariantEnums へのアクセス
一部の COM メソッドは、COM VariantEnumeration 型を返します。WebLogic jCOM の java2com ツールは、返された型を標準 Java java.lang.Enumeration に自動的に変換します。しかし、完全な一致は存在しません。これは、COM Enumeration には 「hasMoreElements()」呼び出しに相当するものがないからです。このため、「NoSuchElementException」を取得するまで「nextElement」を繰り返す必要があります。
ここで、回避策があります。JCOM_PREFETCH_ENUMS Java プロパティを設定した場合、WebLogic jCOM は背後にある次の要素をプリフェッチします。このため、「hasMoreElements()」メソッドを適切に実行できます。