Ibm midrange *CLLE中的BYVAL和*BYREF

Ibm midrange *CLLE中的BYVAL和*BYREF,ibm-midrange,Ibm Midrange,我正在尝试从CLLE调用RPGLE过程。由于RPGLE过程存在,我无法将其更改为extproc(*CL)类型。我目前在V7R1。我使用了下面的代码。如果我通过*BYVAL,参数就不会通过。如果我路过*BYREF,它正在工作。我已经在RPGLE服务中将参数定义为CONST。请让我知道,如果我必须做任何额外的改变,通过价值传递 PGM DCLPRCOPT USRPRF(*OWNER) DF

我正在尝试从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
,那么您就不能传递值

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端的参数需要关键字为pass by value parm。表示通过只读引用传递。当RPGLE中既没有指定
CONST
也没有指定
VALUE
时,则通过引用传递parm


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

我一直认为CONST等同于pass by value。所以CONST是通过引用传递的,但是是只读引用。谢谢你的回答。
CONST
VALUE
都允许您传递文本…
callp myproc('Hi')