问题描述
我正在尝试从RPGLE调用CL程序。 我以前没做过我总是做过对立(从CL调用rpgle) 可能吗 ?通过callp或QCMDEXC ???
解决方法
您可以像调用QCMDEXC一样从RPGLE调用任何程序,您必须使用extpgm关键字定义原型并像过程一样使用它
dcl-pr name_inside_rpgle extpgm('*LIBL/CLPGMNAME'); // program name MUST be uppercased
...
end-pr;
name_inside_rpgle(...);
,
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程序和服务程序(* PGM和* SRVPGM)对象中。可以使用RPG,COBOL,CL或C / C ++ ILE编译器之一来创建它们,并且可以从任何ILE程序中调用它们,而不论使用哪种语言创建。实际上,一个服务程序可以包含多种语言的子过程。在RPGLE中,使用CALLB或CALLP调用子过程,但首选CALLP,因为与在调用程序对象中一样,它执行参数类型检查。需要注意的是,如果子过程驻留在程序对象(* PGM)中,则只能从该程序对象中调用它。共享子过程必须编译到服务程序中。共享是一种共享子过程源的共享类型,然后将模块直接链接到程序对象中。我不真正考虑共享代码,因为仅共享源,而不共享可执行文件。
这使我们想到了命令对象(* CMD)这些是CRTCMD创建的特殊对象。只需输入诸如WRKACTJOB
之类的命令名称,即可在命令行上执行命令。它们可能有参数,也可能没有。这些是由QCMDEXEC
执行的事物,顺便说一下,它们是程序对象,因此可以在RPGLE程序中使用CALLP
进行调用。