Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]() ![]() |
第12章 CORBAアプリケーションの高度な使い方 | > 12.3 複数インタフェースの1プロセスへの実装 |
IDLコンパイラがヘッダファイルにインプリメンテーションおよびインタフェースのリポジトリIDを出力します。
// IDL module mod1 { interface intf1 { ... }; }; module mod2 { interface intf2 { ... }; }; // *.h #define _IMPL_mod1_intf1 "IDL:mod1/intf1:1.0" #define _INTF_mod1_intf1 "IDL:mod1/intf1:1.0" #define _IMPL_mod2_intf2 "IDL:mod2/intf2:1.0" #define _INTF_mod2_intf2 "IDL:mod2/intf2:1.0"
上記IDLの例では、インプリメンテーションリポジトリIDが2つ出力されます。2つのインタフェースを1プロセスで実装する場合は、そのプロセスを表すインプリメンテーションリポジトリIDを1つ決めます。("IDL:*/*:1.0"の形式でなくてもかまいません)。
このプロセスを表すインプリメンテーションリポジトリIDを"IDL:multi-interfaces:1.0"とした場合の例を以下に示します。
コマンドを使って上記プロセスを表すインプリメンテーションリポジトリIDで登録を行います。
複数のインタフェースを実装するため、-axオプションの定義ファイルを使用して、実装するすべてのインタフェースリポジトリIDを定義する必要があります。
OD_impl_inst -ax def
rep_id = IDL:multi-interfaces:1.0 type = .. : IDL:mod1/intf1:1.0 = IDL:mod2/intf2:1.0 = :
サーバプログラムでこのプロセスを表すインプリメンテーションリポジトリIDの活性化を行います。
impl = FJ_ImplementationRep_lookup_id ( impl_rep, "IDL:multi-interfaces:1.0", &env ); CORBA_BOA_impl_is_ready(boa, impl, &env );
OD_or_admコマンドを使用して、上記インプリメンテーションの登録時に指定したリポジトリIDでネーミングサービスへ登録するオブジェクトリファレンスを作成します。
OD_or_adm -a IDL:multi-interfaces:1.0 -c IDL:mod1/intf1:1.0 -n mod1::intf1 OD_or_adm -a IDL:multi-interfaces:1.0 -c IDL:mod2/intf2:1.0 -n mod2::intf2
または、サーバプログラムを使用して、上記OD_or_admコマンドと同様の処理を行います。
impl = FJ_ImplementationRep_lookup_id ( impl_rep, "IDL:multi-interfaces:1.0", &env ); intf1 = CORBA_Repository_lookup_id( intf_rep, _INTF_mod1_intf1, &env ); intf2 = CORBA_Repository_lookup_id( intf_rep, _INTF_mod2_intf2, &env ); /* mod1/intf1のオブジェクトの作成 */ obj1 = CORBA_BOA_create( boa, &id, intf1, impl, &env ); /* mod1/intf1のネーミングサービスへの登録 */ name1._length = name1._maximum = 1; name1._buffer = &name1_component; name_component1.id = "mod1::intf1"; name_component1.kind = ""; CosNaming_NamingContext_bind( cos_naming, &name1, obj1, &env); /* mod2/intf2のオブジェクトの作成 */ obj2 = CORBA_BOA_create( boa, &id, intf2, impl, &env ); /* mod2/intf2のネーミングサービスへの登録 */ name2._length = name2._maximum = 1; name2._buffer = &name2_component; name_component2.id = "mod2::intf2"; name_component2.kind = ""; CosNaming_NamingContext_bind( cos_naming, &name2, obj2, &env);
インタフェース mod1/intf1 へは、名前"mod1::intf1"でネーミングサービスから取り出したオブジェクトを用います。インタフェース mod2/intf2 へは、名前"mod2::intf2"でネーミングサービスから取り出したオブジェクトを用いてリクエストを発行します。
目次
索引
![]() ![]() |