EXTPROC({*CL|*CWIDEN|*CNOWIDEN| {*JAVA:クラス名:}}名前)
- 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 プロシージャーを定義するとき、あるいは C プロシージャーのプロトタイプを定義するときに、 戻り値または値によって渡されるパラメーターが 1A、1G または 1C、5U、5I、あるいは 4F である場合に、*CWIDEN または *CNOWIDEN を使用します。
ILE C ソースがそのプロシージャーに対して #pragma argument(procedure-name,nowiden) を含んでいる場合は *CNOWIDEN を使用し、そうでない場合は *CWIDEN を使用します。
- EXTPROC(*JAVA:クラス名:名前)
- Java™ で書かれたメソッド、または Java によって呼び出される RPG
ネイティブ・メソッドを指定します。最初のパラメーターは *JAVA です。2
番目のパラメーターは、メソッドのクラスを含む文字定数です。3
番目のパラメーターは、メソッド名を含む文字定数です。特別なメソッド名
*CONSTRUCTOR は、そのメソッドがコンストラクターであることを示します。
つまり、このメソッドはクラスをインスタンス化する (新たなクラス・インスタンスを作成する) のに使用できます。
Java プロシージャーを呼び出す詳細については、「Rational Development Studio for i ILE RPG プログラマーの手引き」 を参照してください。
- EXTPROC(名前)
- RPG または COBOL で書かれているか、あるいは RPG または COBOL によって呼び出される、外部プロシージャーを指定します。 この形式は、RPG、COBOL、C、または CL のどれから呼び出されることもできるプロシージャーにも使用されます。 この場合、戻り値およびパラメーターが、前述した *CL、*CWIDEN、および *CNOWIDEN のいずれの場合にもいかなる問題も起きないようにしておくことが必要です。
EXTPROC キーワードは、プロトタイプが定義されているプロシージャーの外部名 を指示します。 この名前は文字定数、またはプロシージャー・ポインターとすることができます。
自由形式定義では、*DCLCASE を名前として
指定することによって、外部名は定義している名前から派生し、名前で使用されたのと同じ大/小文字
になることを指示できます。
外部名としての *DCLCASE の指定を参照してください。
EXTPROC を指定した場合には、バインド呼び出しが行われます。
EXTPGM と EXTPROC のどちらも指定しなかった場合には、コンパイラーはプロシ ージャーが定義されているものと見なし、7 から 21 桁目で見付かった外部名をそれ に割り当てます。
EXTPROC に指定された名前 (または、 EXTPGM も EXTPROC も指定されていないか、EXTPROC(*DCLCASE) が指定されている場合は、 プロトタイプ名またはプロシージャー名) が "CEE" または下線 ('_') で始まっている場合、コンパイラー は、これをシステム組み込みとして扱います。システム提供の API との混同を避けるために、ユーザーのプロシージャーに "CEE" で始まる名前を付けないでください。
D SQLEnv PR EXTPROC('SQLAllocEnv')
プロシージャー・ポインターを指定する場合は、呼び出しで使用する前に、 有効なアドレスを割り当てておかなければ なりません。これは、その戻り値とパラメーターにプロトタイプ定義との整合性があるプロシ ージャーを指していることが必要です。
プロシージャーのプロトタイプが指定される場合、 EXTPROC キーワードはそのプロトタイプに対して指定されます。 それ以外の場合、EXTPROC キーワードはプロシージャー・インターフェースに対して指定されます。 プロシージャーが別の RPG モジュールから呼び出される場合にのみ、プロトタイプの明示的な指定が必要になります。 プロシージャーが同じモジュール内からのみ呼び出される場合、 または RPG 以外の呼び出し元のみによって呼び出される場合には、 プロシージャー・インターフェースからプロトタイプを暗黙的に派生させることができます。
図 1 はパラメーターとしてプロシージャー・ポインター を持っている 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_PROC 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
P isValidCust B EXPORT
D PI N EXTPROC(*CL : 'isValidCust')
D custId 10A CONST
D isValid S N INZ(*OFF)
/free
... calculations using the "custId" parameter return isValid;
/end-free
P E