* CLLE中的BYVAL和* BYREF

时间:2016-10-04 19:17:55

标签: ibm-midrange

我试图从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    

1 个答案:

答案 0 :(得分:1)

如果在RPGLE过程中parms被编码为CONST,那么你根本无法按值传递。

RPGLE方面的参数需要VALUE关键字作为值parm传递。 CONST表示通过只读引用传递。如果在RPGLE中未指定CONSTVALUE,则parm将通过引用传递。

你真的应该添加EXTPROC(* CL)。 RPGLE和CL不会以完全相同的方式返回1字节值;也不会以相同的方式通过值1字节变量。在v6r1之前,您可以编写一个临时的2字节变量来保存返回的值,然后将第一个字节复制到& IS_VLD。