2016-10-04 2 views
1

Я пытаюсь вызвать процедуру RPGLE из CLLE. Поскольку процедура RPGLE существует, я не могу изменить ее на тип extproc (* CL). Я сейчас в V7R1. Я использовал приведенный ниже код. Если я передаю * BYVAL, параметры не пройдут. Если я передаю * BYREF, он работает. Я определил параметры как CONST в службе RPGLE. Пожалуйста, дайте мне знать, нужно ли мне делать какие-либо дополнительные изменения для передачи по значению.* 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

Если Parms кодируются как CONST в процедуре RPGLE, то вы просто не можете пройти по значению.

Параметру на стороне RPGLE понадобится VALUE ключевое слово, чтобы пройти через значение parm. CONST означает, что значение передается только для чтения. Если ни один из CONST или VALUE не указан в RPGLE, то парм передается по ссылке.

Вы действительно должны добавить EXTPROC (* CL). RPGLE и CL не возвращают 1-байтовые значения совершенно одинаково; Аналогичным образом не передаются значения 1-байтных переменных. До v6r1 вы можете закодировать временную 2-байтную переменную, чтобы сохранить возвращаемое значение, а затем просто скопировать первый байт в & IS_VLD.

+0

У меня всегда было впечатление, что CONST эквивалентен передаче по значению. Поэтому CONST передается по ссылке, но только для чтения. Спасибо за ответ – Sekar

+0

Исправить. Оба 'CONST' и' VALUE' позволяют передавать литералы ... 'callp myproc ('Hi');' Но они используют разные механизмы для этого. – Charles

Смежные вопросы