EXTPROC({*CL|*CWIDEN|*CNOWIDEN| {*JAVA:クラス名:}}名前)

EXTPROC キーワードは、次の形式のいずれかが可能です。

EXTPROC(*CL:名前)
ILE CL で書かれた外部プロシージャー、または ILE CL によって呼び出される RPG プロシージャーを指定します。ユーザーのプログラムで使用される戻り値のデータ・タイプについて、CL と RPG とで 異なる処理が行われる場合には、*CL を使用します。たとえば、戻り値が 1A のときに CL プロシージャーによって呼び出される RPG プロシージャーをプロトタイプする場合に、*CL を使用します。
EXTPROC(*CWIDEN:名前|*CNOWIDEN:名前)
ILE C で書かれた外部プロシージャー、または ILE C によって呼び出される RPG プロシージャーを指定します。

ユーザーのプログラムが、C で RPG とは異なる処理がされるデータ・タイプの値によって受け渡される戻り値またはパラメーターを使用する場合には、*CNOWIDEN または *CWIDEN を使用します。C によって呼び出される RPG プロシージャーをプロトタイプする時、あるいは値 1A、1G または 1C、5U、5I、または 4F によって戻り値ないしはパラメーターが渡される場合に C プロシージャーをプロトタイプする時、*CWIDEN または *CNOWIDEN を使用します。

ILE C ソースがそのプロシージャーに対して #pragma argument(procedure-name,nowiden) を含んでいる場合は *CNOWIDEN を使用し、そうでない場合は *CWIDEN を使用します。

EXTPROC(*JAVA:クラス名:名前)
Java で書かれたメソッド、または Java によって呼び出される RPG ネイティブ・メソッドを指定します。最初のパラメーターは *JAVA です。2 番目のパラメーターは、メソッドのクラスを含む文字定数です。3 番目のパラメーターは、メソッド名を含む文字定数です。特別なメソッド名 *CONSTRUCTOR は、そのメソッドがコンストラクターであることを示します。 つまり、このメソッドはクラスをインスタンス化する (新たなクラス・インスタンスを作成する) のに使用できます。

Java プロシージャーを呼び出す詳細については、「WebSphere Development Studio: ILE RPG プログラマーの手引き」 を参照してください。

EXTPROC(名前)
RPG または COBOL で書かれているか、あるいは RPG または COBOL によって呼び出される、外部プロシージャーを指定します。 この形式は、RPG、COBOL、C、または CL のどれから呼び出されることもできるプロシージャーにも使用されます。 この場合、戻り値およびパラメーターが、前述した *CL、*CWIDEN、および *CNOWIDEN のいずれの場合にもいかなる問題も起きないようにしておくことが必要です。

EXTPROC キーワードは、プロトタイプが定義されているプロシージャーの外部名 を指示します。 この名前は文字定数またはプロシージャー・ポインターとすることができます。 EXTPROC を指定した場合には、バインド呼び出しが行われます。

EXTPGM と EXTPROC のどちらも指定しなかった場合には、コンパイラーはプロシ ージャーが定義されているものと見なし、7 から 21 桁目で見付かった外部名をそれ に割り当てます。

EXTPROC に指定された名前 (または EXTPGM と EXTPROC のどちらも指定されなか った場合のプロトタイプ名) が "CEE" または下線 ('_') で始まっている場合に は、コンパイラーはこれをシステム組み込みとして取り扱います。 システム提供の API との混同を避けるために、ユーザーのプロシージャーに "CEE" で始まる名前を付けないでください。

たとえば、プロシージャー SQLAllocEnv (サービス・プログラム QSQCLI の 中にある) のプロトタイプを定義するには、次の定義仕様書をコーディングする ことができます。

            D SQLEnv          PR                  EXTPROC('SQLAllocEnv')

プロシージャー・ポインターを指定する場合は、呼び出しで使用する前に、 有効なアドレスを割り当てておかなければ なりません。これは、その戻り値とパラメーターにプロトタイプ定義との整合性があるプロシ ージャーを指していることが必要です。

図 110 はパラメーターとしてプロシージャー・ポインター を持っている EXTPROC キーワードの例を示しています。

図 110. プロシージャー・ポインターを持つ EXTPROC の使用
 * Assume you are calling a procedure that has a procedure
 * pointer as the EXTPROC. Here is how the prototype would
 * be defined:
D DspMsg          PR            10A   EXTPROC(DspMsgPPtr)
D  Msg                       32767A
D  Length                        4B 0 VALUE
 * Here is how you would define the prototype for a procedure
 * that DspMsgPPtr could be assigned to.
D MyDspMsg        PR                  LIKE(DspMsg)
D  Msg                       32767A
D  Length                        4B 0 VALUE
 * Before calling DSPMSG, you would assign DSPMSGPPTR
 * to the actual procedure name of MyDspMsg, that is
 * MYDSPMSG.
C                    EVAL      DspMsgPPtr = %paddr('MYDSPMSG')
C                    EVAL      Reply = DspMsg(Msg, %size(Msg))
 ...
P MyDspMsg       B
図 111. *CNOWIDEN を指定した EXTPROC の使用 - C コーディング
   char RPG_PROC (short s, float f);
   char C_PROC (short s, float f);
   #pragma argument(RPG_PROC, nowiden)
   #pragma argument(C_PROC, nowiden)

   /* "fn" calls the RPG procedure with unwidened parameters,       */
   /* and expects the return value to be passed according to C      */
   /* conventions.                                                  */
   void fn(void)
   {
      char c;

      c = RPG_PROC(5, 15.3);
   }

   /* Function C_PROC expects its parameters to be passed unwidened.*/
   /* It will return its return value using C conventions.          */
   char C_PROC (short s, float f);
   {
      char c = 'x';

      if (s == 5 || f < 0)
      {
         return 'S';
      }
      else
      {
         return 'F';
      }
   }
図 112. *CNOWIDEN を指定した EXTPROC の使用 - RPG コーディング
D RPG_PROC        PR             1A   EXTPROC(*CNOWIDEN : 'RPG_PROC')
D   short                        5I 0 VALUE
D   float                        4F   VALUE

D C_RPOC          PR             1A   EXTPROC(*CNOWIDEN : 'C_PROC')
D   short                        5I 0 VALUE
D   float                        4F   VALUE

P RPG_PROC        B                   EXPORT
D                 PI             1A
D   short                        5I 0 VALUE
D   float                        4F   VALUE

D   char          S              1A

 * Call the C procedure
C                   EVAL      c = C_PROC(4 : 14.7)

 * Return the value depending on the values of the parameters
C                   IF        short < float
C                   RETURN    'L'
C                   ELSE
C                   RETURN    'G'
C                   ENDIF

P                 E
図 113. *CWIDEN を指定した EXTPROC の使用 - C コーディング
   char RPG_PROC (short s, float f);
   char C_PROC (short s, float f);

   /* Function "fn" calls the RPG procedure with widened parameters,*/
   /* and expects the return value to be passed according to C      */
   /* conventions.                                                  */
   void fn(void)
   {
      char c;

      c = RPG_PROC(5, 15.3);
   }

   /* Function C_PROC expects its parameters to be passed widened.  */
   /* It will return its return value using C conventions.          */
   char C_PROC (short s, float f);
   {
      char c = 'x';

      if (s == 5 || f < 0)
      {
         return 'S';
      }
      else
      {
         return 'F';
      }
   }
図 114. *CWIDEN を指定した EXTPROC の使用 - RPG コーディング
D RPG_PROC        PR             1A   EXTPROC(*CWIDEN : 'RPG_PROC')
D   short                        5I 0 VALUE
D   float                        4F   VALUE

D C_PROC          PR             1A   EXTPROC(*CWIDEN : 'C_PROC')
D   short                        5I 0 VALUE
D   float                        4F   VALUE

P RPG_PROC        B                   EXPORT
D                 PI             1A
D   short                        5I 0 VALUE
D   float                        4F   VALUE

D   char          S              1A

 * Call the C procedure
C                   EVAL      c = C_PROC(4 : 14.7)

 * Return the value depending on the values of the parameters
C                   IF        short < float
C                   RETURN    'L'
C                   ELSE
C                   RETURN    'G'
C                   ENDIF

P                 E
図 115. *CL を指定した EXTPROC の使用 - CL コーディング
         /* CL procedure CL_PROC */
         DCL &CHAR1 TYPE(*CHAR) LEN(1)

         /* Call the RPG procedure */
         CALLPRC RPG_PROC RTNVAR(&CHAR1)
図 116. *CL を指定した EXTPROC の使用 - RPG コーディング
D RPG_PROC        PR             1A   EXTPROC(*CL : 'RPG_PROC')

P RPG_PROC        B                   EXPORT
D                 PI             1A

C                   RETURN    'X'

P                 E