ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)
Interstage

G.1.5 その他のデータ型の指定方法

その他のデータ型については、CreateType関数またはCreateTypeById関数を使用して構造体等のデータ型のインスタンスを作成し、インスタンス内のメンバにアクセスするようにしなければなりません。なお、CreateType関数では、アクセスしたいデータ型の名前を指定しますが、CreateTypeById関数では、データ型のリポジトリIDを指定します。


G.1.5.1 シーケンス型

シーケンスは1次元の配列として扱います。なお、データ型により、定義が異なります。


(1) シーケンスがany型以外の基本データ型の場合

シーケンスが固定長の場合は、1次元の配列をIDLで指定した個数分、獲得します。

シーケンスがlong型で宣言された場合のVisual Basicでの使用例を以下に示します。


IDL言語
typedef sequence<long,10> vec10;       // 10個のlong型

Visual Basic
Dim vec10(10) As long                  // 10個のlong型を宣言
vec10(0) = 100                         // 各メンバにデータを代入
vec10(1) = 101                         // 各メンバにデータを代入
... 
vec10(9) = 109                         // 各メンバにデータを代入

(2) シーケンスが構造体、共用体、any型、オブジェクト、またはTypeCodeの場合

シーケンスが構造体、共用体、any型、オブジェクト、またはTypeCodeから構成される場合は、シーケンスのメンバをCreateType関数/CreateTypeById関数でオブジェクトのリファレンスを検索し、その結果をObject型の配列に格納します。

シーケンスがstruct型で宣言された場合のVisual Basicでの使用例を以下に示します。


IDL言語
typedef struct STR {                         // aとbを持つstruct
    long a,b; 
} Foo; 
typedef sequence<Foo,10> FooSeq;             // aとbを持つstruct10個のシーケンス

Visual Basic
Dim FooSeq(10) As Object                     // 10個のObject型を宣言

FooSeq(0) = factory.CreateType( obj, "Foo" ) // データ型のリファレンスを10個分検索
FooSeq(1) = factory.CreateType( obj, "Foo" ) 
... 

G.1.5.2 構造体

構造体に値を設定するには、CreateType関数/CreateTypeById関数でオブジェクトのリファレンスを検索し、その結果をObject型変数に格納します。オブジェクトのプロパティに値を設定することにより、構造体のメンバに値を設定することができます。

構造体のVisual Basicでの使用例を以下に示します。


IDL言語
interface example5 {
    typedef struct STR {        // long型aとbを持つstruct
        long a,b; 
    }Foo; 
    ... 
}; 

Visual Basic
Dim str1 As Object                         // データ型structのリファレンス

Set str1 = factory.CreateType(obj, "Foo")  // データ型のリファレンスの検索
str1.a = 100                               // aにデータを代入
str1.b = -50                               // bにデータを代入

G.1.5.3 共用体

共用体に値を設定するには、CreateType関数/CreateTypeById関数でオブジェクトのリファレンスを検索し、その結果をObject型変数に格納します。オブジェクトのプロパティに設定することにより、共用体のメンバに値を設定することができます。プロパティのUNION_dは、データの種別を格納した弁別情報です。

共用体のVisual Basicでの使用例を以下に示します。


IDL言語
interface example6 {
    typedef union UNI switch(long) {   // long、float、charを持つ共用体
        case 1 : long x; 
        case 2 : float y; 
        default: char z; 
    } Foo; 
    short set(in Foo udata);           // 共用体のパラメタを持つset関数、
                                       // 復帰値short型
    ... 
} ; 

Visual Basic
Dim uni1 As Object                           // データ型のリファレンス
Dim discriminator As Variant                 // 弁別情報格納変数
Dim ret As Integer                           // 復帰値格納変数
Dim ans As Variant                           // 共用体データ格納変数

Set uni1 = factory.CreateType(obj, "Foo")    // データ型のリファレンスの検索
uni1.x = 100                                 // 共用体にデータを代入
ret = obj.set(uni1)                          // set関数の呼び出し

discriminator = uni1.UNION_d                 // 弁別情報の格納
Select Case discriminator                    // 弁別情報によるデータの判定
Case 1                                       // long型の処理
    ans = uni1.x
Case 2
    ans = uni1.y
Case Else                                    // char型の処理
    ans = uni1.z

G.1.5.4 配列

配列は、Visual Basicの配列を使用します。ただし、配列が構造体、共用体、any型、オブジェクト、TypeCodeの場合は、CreateType関数/CreateTypeById関数でインスタンスを作成し、その結果をObject型変数に格納します。

配列のVisual Basicでの使用例を以下に示します。


IDL言語
typedef long a[4][5]; 
interface example8 {
    typedef struct STR {
        long a,b; 
    } Foo; 
    typedef Foo FooArr[3][4]; 
    ... 
} ; 

Visual Basic
Dim a(4,3) As long
Dim FooArr(3,2) As Object 
Dim factory As Object 
Dim obj As Object 

a(0,0) = 100
a(1,0) = 101
... 
a(4,3) = 119

Set factory = CreateObject("CORBA.Factory") 
Set obj = factory.GetObject("example8") 
FooArr(0,0) = factory.CreateType(obj, "Foo")
FooArr(1,0) = factory.CreateType(obj, "Foo")
...