以下にCORBAとVisual Basicで提供しているデータ型と、Visual Basicでの指定方法を示します。
CORBAデータ型 | Visual Basicでの指定方法 | ||
---|---|---|---|
基本データ型 | 整数型 | long | Long |
short | Integer | ||
unsigned long | Long | ||
unsigned short | Long | ||
浮動小数点型 | float | Single | |
double | Double | ||
文字型 | char | Integer | |
オクテッド型 | octet | Integer | |
ブーリアン型 | boolean | Integer | |
文字列型 | string | “G.1.4.1 文字列型”参照 | |
列挙型 | enum | “G.1.4.2 列挙型”参照 | |
any型 | any | “G.1.4.3 any型”参照 | |
シーケンス型 | sequence | “G.1.5.1 シーケンス型”参照 | |
構造体 | struct | “G.1.5.2 構造体”参照 | |
共用体 | union | “G.1.5.3 共用体”参照 | |
配列 | array | “G.1.5.4 配列”参照 |
データ型の注意事項
unsigned shortを持つサーバアプリケーションを呼び出す場合、unsigned shortの範囲で指定します。マイナス値や65536以上の値は指定できません。
unsigned longを持つサーバアプリケーションを呼び出す場合、マイナス値は指定できません。
charやoctetを持つサーバアプリケーションを呼び出す場合、charの範囲で指定します。マイナス値や256以上の値は指定できません。
booleanを持つサーバアプリケーションを呼び出す場合、0と1以外の値は指定できません。
any型を持つサーバアプリケーションを呼び出す場合、変数をObject型で宣言し、データ型のインスタンスをCreateType関数またはCreateTypeById関数で作成し、valueやtypeはインスタンスのプロパティとして扱います。
objref型/TypeCode型/配列型をパラメタとする場合、およびany型/シーケンス型/構造体/共用体のメンバにstring, objref, struct, union, sequence, arrayを持つ場合は、十分なメモリを確保する必要があります。
Visual Basicでのアプリケーション作成時の注意事項
(1) メモリの解放方法
Visual Basicでのオブジェクトおよびout,inoutパラメタで使用した領域の解放方法を以下に示します。
CORBAのオブジェクト(CreateTypeしたデータも含む)は以下のように解放します。
Set Ap = Nothing Ap:解放したいオブジェクト
配列の宣言は固定数ではなく可変(動的)で宣言し、Erase文で解放します。
文字列はNULL文字を設定することで解放します。
str = ""
(2) 配列(sequence型含む)のパラメタの受渡し
配列(sequence型含む)をパラメタとして受渡しを行う場合、以下の手順で行います。配列宣言でVisual Basic表現とIDL宣言で要素並びに差異があります。
Visual Basic Dim a(2,3) As Long IDL定義 long a(4,3)
inoutで要素数が変更される場合は、動的宣言を行い、クライアントでReDim abc(n1,n2,n3) As Longのように再配置してデータを送付します。
サーバから結果を受け取った際、データの取り出し前にReDim Preserve abc(m1,m2m3) As Longを発行し、内容を保持した状態で型変換を行い、データにアクセスします。
なお、inパラメタに指定した領域で、値が未設定域である場合は、0が渡されます。
固定長、可変長の文字列は、それぞれ、長さ指定のあるStringと、長さ指定のないStringを使用します。なお、固定長の文字列を使用する場合は、IDL定義に“使用する文字数+1”の値を指定する必要があります。
文字列のVisual Basicでの使用例を以下に示します。
typedef string<11> sten; // 固定長(10文字)のString typedef string sinf; // 可変長のString
Dim sten As String * 11 // 固定長(10文字)のString Dim sinf As String // 可変長のString
any型を持つサーバアプリケーションを呼び出す場合は、変数をObject型で宣言し、データ型のオブジェクトリファレンスをCreateType関数またはCreateTypeById関数で検索し、valueやtypeはそのオブジェクトのプロパティとして扱います。any型データのTypeCodeプロパティに値を設定する場合は、サーバにTypeCodeを返すオペレーションを用意し、返された値を設定します。valueプロパティにはデータ型に応じた方法で値を設定します。
(1) any型データにデータを設定する場合
any型データのVisual Basicで設定する使用例を以下に示します。
module mod { typedef any typeany; // any型 interface intf { TypeCode GetTypeCode();// TypeCodeプロパティに設定するTypeCodeを返す関数 any op( in any a ); // any型のパラメタを持つop関数 // any型の復帰値 }; };
Dim factory As Object // OLE-CORBAゲートウェイのインスタンス Dim obj As Object // サーバのオブジェクトリファレンス Set factory = CreateObject("CORBA.Factory") // OLE-CORBAゲートウェイの起動 Set obj = factory.GetObject("example") // オブジェクトの検索 Dim anydata As Object // データ型のリファレンス(パラメタ受渡し用) Dim anydata1 As Object // データ型のリファレンス(復帰値用) Dim obj3 As Object // データ型のリファレンス(TypeCode用) Set anydata =factory.CreateType(obj, "typeany") // データ型のリファレンスの検索 Set obj3= obj.GetTypeCode() // TypeCodeオブジェクトの獲得 anydata.TypeCode = obj3 // TypeCodeの設定 anydata.Value = &H80000000 // データの設定 anydata1 =obj.op(anydata) // op関数の呼び出し
(2) any型データからデータを取り出す場合
any型データから値を取り出す場合は、any型データのTypeCodeメンバに対してkind関数を呼び出し、データの型を取り出します。取り出したデータ型に対する値をvalueメンバから取り出します。any型データのVisual Basicでの使用例を以下に示します。
anydata = obj.op(anydata) // op関数の呼び出し kind = anydata.TypeCode.kind // TypeCodeの取り出し Select Case kind Case 2 ‘short // データ型がshortの処理 s = anydata.Value Case 15 ‘struct // データ型がstructの処理 l = anydata.Value.d1 str = anydata.Value.d2 Case 16 ‘union // データ型がunionの処理 dic = anydata.Value.UNION_d Select Case dic Case 1 l = anydata.Value.d1 Case 2 str = anydata.Value.d2 End Select End Select