例: Java のメソッドを呼び出す ActiveX クライアント・アプリケーション
ActiveX to EJB (Enterprise Java™ Beans) ブリッジでは、 メソッドはネイティブ言語のメソッド起動構文を使用して呼び出されます。
- Java メソッドとは異なり、ActiveX はメソッド (およびコンストラクター) のポリモアフィズムをサポートしません。 つまり、同じクラス内で同じ名前のメソッドを 2 つ持つことはできません。
- Java メソッドには大/小文字の区別がありますが、ActiveX 自動化には大/小文字の区別がありません。
Java のポリモアフィックの動作を補正するには、メソッド呼び出しに正しいパラメーター型を指定します。 パラメーター型によって、起動すべき正しいメソッドが判別されます。 使用する正しい型のリストについては、『ActiveX to EJB ブリッジによるデータ型の変換』を参照してください。
- 例えば、次の Visual Basic コードは、 CLng() メソッドがなかったり、toHexString 構文が間違って ToHexString と入力されていたりすると、失敗します。
... Dim strHexValue as String strHexValue = clsMyString.toHexString(CLng(255))
- 場合によっては、一部の開発環境で、 メソッド呼び出しの大/小文字を強制的に未変更のままにすることが困難な場合があります。 例えば、Visual Basic では、メソッド close() (小文字) を呼び出す場合、Visual Basic コードはそれを大文字から始まる "Close()" にします。Visual Basic において、この動作を回避する唯一の有効な方法は、CallByName() メソッドを使用することです。 以下に例を示します。
o.Close(123) 'Incorrect... CallByName(o, "close", vbMethod, 123) 'Correct...
また、VBScript では、次のように Eval 関数を使用します。o.Close(123) 'Incorrect... Eval("o.Close(123)") 'Correct...
- 関数の戻り値は、 常に正しい型に動的に変換されます。 しかし、Visual Basic では set キーワードを使用するように、注意する必要があります。 プリミティブ・データ型以外が戻されることが予期される場合は、set を使用する必要があります。 (プリミティブ・データ型が戻されることが予想される場合は、set を使用する必要はありません。) 詳しくは、次の例を参照してください。
Set oMyObject = o.getObject iMyInt = o.getInt
場合によっては、ラッパー・クラスが自動的にプリミティブ型に変換されるため、 メソッド呼び出しから戻されるオブジェクトの型がわからないことがあります (例えば、 java.lang.Integer は ActiveX 自動化 Long を戻します)。 そのような場合は、ユーザーの言語の組み込み例外処理技法を使用して、 戻りの型を強制しなければならないことがあります (例えば、Visual Basic の On Error および Err.Number)。
- 文字引数を持つメソッド
ActiveX 自動化は、 Java メソッドがサポートする文字型をネイティブでサポートしないため、 ActiveX to EJB ブリッジは、ストリングを使用します (Java コードでは文字が複数バイトを持つため、 バイトや VT_I1 は無効です)。 CHAR または java.lang.Character 型を使用するメソッドを呼び出そうとする場合は、 JMethodArgs 引数コンテナーを使用して、 メソッドまたはコンストラクターに文字値を渡す必要があります。 この引数コンテナーの使用方法について詳しくは、『「オブジェクト」型を引数および抽象引数として持つメソッド』を参照してください。
- 「オブジェクト」型を引数および抽象引数として持つメソッド
Java プログラミングのポリモアフィック特性のため、ActiveX to Java ブリッジは、直接引数型マッピングを使用してメソッドを見つけます。 このメソッドは、ほとんどの場合正しく機能しますが、場合によっては、 メソッドは、親クラスまたは抽象クラスを引数型 (例えば、java.lang.Object) として持つものとして宣言されます。 任意の型のオブジェクトをメソッドに送信する機能が必要です。 この機能を獲得するには、XJB.JMethodArgs オブジェクトを使用して、 パラメーターを強制的にメソッド上のパラメーターに一致させる必要があります。 JClassFactory.GetArgsContainer() メソッドを使用して、JMethodArgs インスタンスを取得することができます。
JMethodArgs オブジェクトはメソッド・パラメーターまたは引数のコンテナーです。 このコンテナーを使用すると、パラメーターを 1 つずつそのコンテナーに追加することができ、 メソッド呼び出しに JMethodArgs オブジェクトを送信することができます。 JClassProxy オブジェクトおよび JObjectProxy オブジェクトは 、JMethodArgs オブジェクトを認識し、正しいメソッドを見つけて 、Java 言語がパラメーターを正しく指定できるようにします。
例えば、Hashtable オブジェクトにエレメントを追加するには、メ ソッド構文は Object put (オブジェクト・キー、オブジェクト値) です。 Visual Basic では、メソッドの使用法は、次のサンプル・コードのようになります。Dim oMyHashtable as Object Set oMyHashtable = _ oXJB.NewInstance(oXJB.FindClass("java.utility.Hashtable")) ' This line will not work. The ActiveX to EJB bridge cannot find a method ' called "put" that has a short and String as a parameter: oMyHashtable.put 100, "Dogs" oMyHashtable.put 200, "Cats" ' You must use a XJB.JMethodArgs object instead: Dim oMyHashtableArgs as Object Set oMyHashtableArgs = oXJB.GetArgsContainer oMyHashtableArgs.AddObject("java.lang.Object", 100) oMyHashtableArgs.AddObject("java.lang.Object", "Dogs") oMyHashtable.put oMyHashTableArgs ' Reuse the same JMethodArgs object by clearing it. oMyHashtableArgs.Clear oMyHashtableArgs.AddObject("java.lang.Object", 200) oMyHashtableArgs.AddObject("java.lang.Object", "Cats") oMyHashtable.put oMyHashTableArgs