CLLE 中的 *BYVAL 和 *BYREF

*BYVAL and *BYREF in CLLE

我正在尝试从 CLLE 调用 RPGLE 过程。由于 RPGLE 程序已经存在,我无法将其更改为 extproc(*CL) 类型。我目前在 V7R1 中。我使用了下面的代码。如果我通过 *BYVAL,则参数不会被传递。如果我经过 *BYREF 它正在工作。我在 RPGLE 服务中将参数定义为 CONST。如果我必须进行任何其他更改才能按值传递,请告诉我。

PGM                                                      

DCLPRCOPT  USRPRF(*OWNER) DFTACTGRP(*NO) ACTGRP(*NEW) +  
             BNDDIR(SAMSRV)                              

DCL        VAR(&CLNBR) TYPE(*CHAR) LEN(9)                
DCL        VAR(&USER) TYPE(*CHAR) LEN(10)                
DCL        VAR(&IS_VLD) TYPE(*LGL)                       

CHGVAR     VAR(&CLNBR) VALUE('01112201T')                
CHGVAR     VAR(&USER)  VALUE('UUUUU ')                   

CALLPRC    PRC('IsValidClient') PARM((&CLNBR *BYREF) +
             (&USER *BYREF)) RTNVAL(&IS_VLD)             
ENDPGM    

如果参数在 RPGLE 程序中被编码为 CONST,那么您根本无法按值传递。

RPGLE 端的参数需要VALUE keyword to be a pass by value parm. CONST表示通过只读引用传递。当 RPGLE 中既没有指定 CONST 也没有指定 VALUE 时,则参数通过引用传递。

您确实应该添加 EXTPROC(*CL)。 RPGLE 和 CL 不以完全相同的方式 return 1 字节值;也不会以相同的方式按值传递 1 字节变量。在 v6r1 之前,您可以编写一个临时的 2 字节变量来保存 returned 值,然后只需将第一个字节复制到 &IS_VLD.