2016-10-04 45 views
1

我想从CLLE调用RPGLE过程。由于RPGLE过程存在,我不能将其更改为extproc(* CL)类型。我目前在V7R1。我已经使用了下面的代码。如果我通过* BYVAL参数没有通过。如果我通过* BYREF它正在工作。我已经在RPGLE服务中将参数定义为CONST。请让我知道,如果我必须做任何额外的更改通过价值传递。* BYVAL和* BYREF CLLE

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

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

RPGLE端的参数需要VALUE关键字为值传递值parm。 CONST表示通过只读引用传递。在RPGLE中既没有指定CONST也没有指定VALUE,则parm通过引用传递。

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

+0

我总是觉得CONST等于按价值传递。所以CONST是通过引用传递的,但是只读引用。谢谢你的回答 – Sekar

+0

正确。 'CONST'和'VALUE'都允许你传递文字......'callp myproc('Hi');'但他们使用不同的机制来这样做。 – Charles