проблемы с вызовом CL-программы из программы RPGLE

#ibm-midrange #rpgle #cl

#ibm-средний уровень #rpgle #cl

Вопрос:

Я пытаюсь вызвать CL-программу из RPGLE. Раньше я этого не делал. Я всегда делал oposit (вызывая rpgle из CL), возможно ли это? через callp или QCMDEXC???

Ответ №1:

Вы можете вызвать любую программу из RPGLE, как вы вызываете QCMDEXC, вам нужно определить прототип с помощью ключевого слова extpgm и использовать его как процедуру

 dcl-pr name_inside_rpgle extpgm('*LIBL/CLPGMNAME'); // program name MUST be uppercased 
  ...
end-pr;

name_inside_rpgle(...);
  

Ответ №2:

CALLP и QCMDEXEC сделайте две совершенно разные вещи. CALLP предназначен для выполнения программных объектов (* PGM) и подпрограмм ILE (без типа объекта, но содержащихся в *SRVPGM или даже *PGM), независимо от того, какой язык использовался для компиляции этого объекта *PGM (или * SRVPGM). QCMDEXEC предназначен для выполнения командных объектов (* CMD).

Давайте посмотрим на объект *PGM . Это скомпилированный объект, созданный одним из компиляторов / ассемблеров RPG, COBOL, C / C , CL, PL / 1 или MI. Все программные объекты могут вызываться любым из этих языков, если вызов определен правильно. Для RPGLE вы можете использовать CALL или CALLP, хотя CALLP предпочтительнее, поскольку он обеспечивает проверку типа параметра.

Если посмотреть на подпроцедуры, они содержатся в объектах ILE program и service program (* PGM amp; * SRVPGM). Они могут быть созданы с помощью одного из компиляторов RPG, COBOL, CL или C / C ILE и могут быть вызваны из любой программы ILE, независимо от языка, на котором она была создана. Фактически, одна сервисная программа может содержать подпроцедуры с нескольких языков. Подпрограммы вызываются в RPGLE с использованием CALLB или CALLP, хотя CALLP предпочтительнее, поскольку, как и при вызове программных объектов, он принудительно проверяет тип параметра. Здесь есть одно предостережение: если подпрограмма находится в программном объекте (* PGM), она может быть вызвана только из этого программного объекта. Общие подпрограммы должны быть скомпилированы в служебные программы. Существует тип совместного использования, при котором источник подпрограмм является общим, а модули затем связываются непосредственно с объектом program. Я действительно не рассматриваю этот общий код, поскольку общим является только исходный код, исполняемый файл — нет.

Это приводит нас к командным объектам (* CMD) Это специальные объекты, созданные CRTCMD. Команды можно выполнять в командной строке, просто введя имя команды, например WRKACTJOB . У них могут быть параметры или нет. Это вещи, выполняемые QCMDEXEC , который, кстати, является объектом program, поэтому его можно вызвать с помощью CALLP программы RPGLE.

Комментарии:

1. Это отличное сравнение этих разных исполняемых модулей и того, как их можно вызывать.

Ответ №3:

некоторые заметки, которые у меня есть 16 лет назад … удачи.

 /IF Defined(*CRTBNDRPG)
H DFTACTGRP(*NO)
/ENDIF
H BNDDIR('QC2LE')
D GoCmd PR 10I 0 Extproc('system')
D CmdStr * value
D options(*string)
D NullString C -1
D Success C 0
D Returncode S 10I 0
D User S 10 Inz(*User) Varying
/free
   Returncode = Gocmd('DLYJOB DLY(300)');  //change to another CL command here
   Select;
   When Returncode = Success; // Command was successful
   When Returncode = NullString; // Command string was null
   Other;
   Endsl;
   *INLR=*ON;
/end-free