CORBAの初期化メソッドCORBA-ORB_INITを呼び出し初期化処理を行います。当メソッドの結果として、ORBのオブジェクトリファレンスが返されます。このオブジェクトリファレンスは、以降で呼び出すORBインタフェースを使用する場合に指定します。環境部(ENVIRONMENT DIVISION)およびデータ部(DATA DIVISION)を定義します。ここでは、IDLファイル名を“simple.idl”として説明します。IDLコンパイラが出力する登録集ファイル名は、“simple--rep.cbl”, “simple--const.cbl”,“simple--copy.cbl”となります。
IDENTIFICATION DIVISION. PROGRAM-ID. "SIMPLE_C" * ENVIRONMENT DIVISION. CONFIGURATION SECTION. REPOSITORY. * ObjectDirectorの標準登録集(リポジトリ宣言用) COPY CORBA--REP. * ネーミングサービスの標準登録集(リポジトリ宣言用) COPY COSNAMING--REP. * IDLコンパイラが出力した登録集(リポジトリ宣言用) COPY SIMPLE--REP. . SPECIAL-NAMES. SYMBOLIC CONSTANT * ObjectDirectorの標準登録集(定数宣言用) COPY CORBA--CONST. * ネーミングサービスの標準登録集(定数宣言用) COPY COSNAMING--CONST. * IDLコンパイラが出力した登録集(定数宣言用) COPY SIMPLE--CONST. . * DATA DIVISION. WORKING-STORAGE SECTION. 01 EXCEPTION-ID USAGE OBJECT REFERENCE CORBA-STRING. 01 EXCEPTION-ID-VALUE PIC X(50). 01 API-NAME PIC X(50). 01 ORB USAGE OBJECT REFERENCE CORBA-ORB. * PROCEDURE DIVISION. * DECLARATIVES. * ZEROPARAM-ERR SECTION. USE EXCEPTION ODDEMO-CALCULATOR-ZEROPARAM. DISPLAY "ZEROPARAM Exception: " API-NAME. EXIT PROGRAM. END-ZEROPARAM-ERR. * OTHER-ERROR SECTION. USE EXCEPTION CORBA-EXCEPTION. DISPLAY "CORBA::UserException: " API-NAME. SET EXCEPTION-ID TO IDL-ID OF EXCEPTION-OBJECT AS CORBA-EXCEPTION. INVOKE EXCEPTION-ID "GET-VALUE" RETURNING EXCEPTION-ID-VALUE. DISPLAY " Exception-id: " EXCEPTION-ID-VALUE. EXIT PROGRAM. END-OTHER-ERR. * END DECLARATIVES. * MAIN SECTION. * MOVE "CORBA::ORB_init" TO API-NAME. INVOKE CORBA "ORB_INIT" USING "SIMPLE_C" FJ-OM_ORBID RETURNING ORB.
例外処理については、“G.2.3 クライアントアプリケーションの例外処理”を参照してください。
実行するオブジェクトをネーミングサービスから検索するために、ネーミングサービスのオブジェクトリファレンスが必要となります。CORBAインタフェースのオブジェクトリファレンスの取出しメソッドCORBA-ORB-RESOLVE_INITIAL_REFERENCESによりネーミングサービスのオブジェクトリファレンスを取り出します。このとき、CORBA-ORB-OBJECTID_NAMESERVICEをメソッドのパラメタとして指定します。なお、この定数は、各ORBベンダーが提供しているインクルードファイル等で定義されています。
DATA DIVISION. WORKING-STORAGE SECTION. 01 OBJ USAGE OBJECT REFERENCE CORBA-OBJECT. PROCEDURE DIVISION. MOVE "CORBA::ORB::resolve_initial_references" TO API-NAME. INVOKE ORB "RESOLVE_INITIAL_REFERENCES" USING CORBA-ORB-OBJECTID_NAMESERVICE RETURNING OBJ.
ネーミングサービスのCOSNAMING-NAMINGCONTEXT-RESOLVEメソッドにより、これから実行したいサーバアプリケーションのオブジェクトリファレンスを取り出します。検索したいオブジェクト名を当メソッドのパラメタとして指定します。
DATA DIVISION. WORKING-STORAGE SECTION. 01 NAMING-CONTEXT USAGE OBJECT REFERENCE COSNAMING-NAMINGCONTEXT. 01 NAME TYPE COSNAMING-NAME. 01 NAME-COMPONENT USAGE OBJECT REFERENCE COSNAMING-NAMECOMPONENT. 01 NAME-ID USAGE OBJECT REFERENCE CORBA-STRING. 01 NAME-KIND USAGE OBJECT REFERENCE CORBA-STRING. 01 TARGET-OBJ USAGE OBJECT REFERENCE ODDEMO-CALCULATOR. PROCEDURE DIVISION. INVOKE COSNAMING-NAMINGCONTEXT "NARROW" USING OBJ RETURNING NAMING-CONTEXT. * INVOKE CORBA-STRING "NEW-WITH-VALUE" USING "ODdemo::calculator" RETURNING NAME-ID. * INVOKE CORBA-STRING "NEW-WITH-VALUE" USING " " RETURNING NAME-KIND. * INVOKE COSNAMING-NAMECOMPONENT "NEW" RETURNING NAME-COMPONENT. * SET IDL-ID OF NAME-COMPONENT TO NAME-ID. SET KIND OF NAME-COMPONENT TO NAME-KIND. * INVOKE SEQUENCE-NAMECOMPONENT-001 "NEW-WITH-LENGTH" USING 1 RETURNING NAME. * INVOKE NAME "SET-VALUE" USING 1 NAME-COMPONENT. * MOVE "CosNaming::NamingContext::resolve" TO API-NAME. INVOKE NAMING-CONTEXT "RESOLVE" USING NAME RETURNING OBJ. * INVOKE ODDEMO-CALCULATOR "NARROW" USING OBJ RETURNING TARGET-OBJ.
サーバプログラムのメソッドを呼び出します。メソッド名はIDLで指定したモジュール名、インタフェース名およびメソッド名を2つのコロン(“::”)でつなげた形式で指定します。この例では、ODdemo,Calculator,calculateがそれにあたります。なお、メソッド呼出し時にネーミングサービスで求めたサーバアプリケーションのオブジェクトリファレンスとサーバプログラムで例外が発生した場合に例外情報を設定してもらうためにRETURNING指定を行います。
DATA DIVISION. WORKING-STORAGE SECTION. 01 RESULT TYPE ODDEMO-CALCULATOR-RESULT. 01 PARAM-A TYPE CORBA-LONG. 01 PARAM-B TYPE CORBA-LONG. PROCEDURE DIVISION. MOVE 10 TO PARAM-A. MOVE 5 TO PARAM-B. * MOVE "ODdemo::Calculator::calculate(10,5)" TO API-NAME. INVOKE TARGET-OBJ "CALCULATE" USING PARAM-A PARAM-B RETURNING RESULT. * PERFORM PRINT-RESULT. * MOVE 100 TO PARAM-A. MOVE 0 TO PARAM-B. * MOVE "ODdemo::Calculator::calculate(100,0)" TO API-NAME. INVOKE TARGET-OBJ "CALCULATE" USING PARAM-A PARAM-B RETURNING RESULT. * PERFORM PRINT-RESULT. * STOP RUN. * END-MAIN.