EXTPROC キーワードは、次の形式のいずれかが可能です。
ユーザーのプログラムが、C で RPG とは異なる処理がされるデータ・タイプの値によって受け渡される戻り値またはパラメーターを使用する場合には、*CNOWIDEN または *CWIDEN を使用します。C によって呼び出される RPG プロシージャーをプロトタイプする時、あるいは値 1A、1G または 1C、5U、5I、または 4F によって戻り値ないしはパラメーターが渡される場合に C プロシージャーをプロトタイプする時、*CWIDEN または *CNOWIDEN を使用します。
ILE C ソースがそのプロシージャーに対して #pragma argument(procedure-name,nowiden) を含んでいる場合は *CNOWIDEN を使用し、そうでない場合は *CWIDEN を使用します。
Java プロシージャーを呼び出す詳細については、「WebSphere Development Studio: ILE RPG プログラマーの手引き」 を参照してください。
EXTPROC キーワードは、プロトタイプが定義されているプロシージャーの外部名 を指示します。 この名前は文字定数またはプロシージャー・ポインターとすることができます。 EXTPROC を指定した場合には、バインド呼び出しが行われます。
EXTPGM と EXTPROC のどちらも指定しなかった場合には、コンパイラーはプロシ ージャーが定義されているものと見なし、7 から 21 桁目で見付かった外部名をそれ に割り当てます。
EXTPROC に指定された名前 (または EXTPGM と EXTPROC のどちらも指定されなか った場合のプロトタイプ名) が "CEE" または下線 ('_') で始まっている場合に は、コンパイラーはこれをシステム組み込みとして取り扱います。 システム提供の API との混同を避けるために、ユーザーのプロシージャーに "CEE" で始まる名前を付けないでください。
たとえば、プロシージャー SQLAllocEnv (サービス・プログラム QSQCLI の 中にある) のプロトタイプを定義するには、次の定義仕様書をコーディングする ことができます。
D SQLEnv PR EXTPROC('SQLAllocEnv')
プロシージャー・ポインターを指定する場合は、呼び出しで使用する前に、 有効なアドレスを割り当てておかなければ なりません。これは、その戻り値とパラメーターにプロトタイプ定義との整合性があるプロシ ージャーを指していることが必要です。
図 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
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'; } }
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
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'; } }
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
/* CL procedure CL_PROC */ DCL &CHAR1 TYPE(*CHAR) LEN(1) /* Call the RPG procedure */ CALLPRC RPG_PROC RTNVAR(&CHAR1)
D RPG_PROC PR 1A EXTPROC(*CL : 'RPG_PROC') P RPG_PROC B EXPORT D PI 1A C RETURN 'X' P E
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.