AS/400 ILE C中如何从C程序调用已编译C程序并按引用传参
可行实现方案
AS/400(现IBM i)平台不提供POSIX标准的execlp函数,要实现和COBOLCALL BY REFERENCE等价的C程序调用效果,可通过IBM i专属的动态程序调用API或者ILE C的程序链接语法实现,以下是两种常用方案:
方案1:使用QLRCALLP API按引用传递参数调用外部程序
这是最贴近你COBOL调用逻辑的方案,参数默认按引用传递,直接调用已编译好的*PGM对象:
#include <qleawi.h> #include <stdio.h> int main(void) { // 定义要传递的参数 char arg1[20] = "test param1"; char arg2[30] = "test param2"; int rc; // 参数列表:每个元素是参数的指针,最后以NULL结尾 void* param_list[] = {&arg1, &arg2, NULL}; // 调用已编译的MYPROGRAM *PGM对象 // 第二个参数是库名,NULL表示从当前库列表查找 rc = QLRCALLP("MYPROGRAM", NULL, param_list); if (rc != 0) { printf("调用程序失败,返回码:%d\n", rc); return 1; } // 调用完成后arg1、arg2已经被被调用程序修改 printf("调用后参数1:%s,参数2:%s\n", arg1, arg2); return 0; }
注意:被调用的C程序需要按ILE标准接收参数,示例代码如下:
// 被调用程序MYPROGRAM的代码 int main(int argc, char* argv[]) { // argv[1]对应传入的arg1指针,argv[2]对应arg2指针,直接修改即可生效 sprintf(argv[1], "modified param1"); sprintf(argv[2], "modified param2"); return 0; }
方案2:使用ILE绑定调用(适用于被调用程序可编译为*MODULE对象的场景)
如果被调用程序可以单独编译为MODULE对象,你可以通过#pragma linkage声明直接调用,性能更高:
- 先把被调用程序编译为*MODULE对象:
CRTCMOD MODULE(MYLIB/MYMODULE) SRCFILE(MYLIB/QCSRC) - 主程序代码如下:
#include <stdio.h> // 声明外部程序的链接方式,OS表示是操作系统级别的程序对象 #pragma linkage(MYMODULE, OS) // 声明参数结构,直接按引用传递即可 void MYMODULE(char* arg1, char* arg2); int main(void) { char arg1[20] = "test param1"; char arg2[30] = "test param2"; // 直接调用,参数默认按引用传递 MYMODULE(arg1, arg2); printf("调用后参数1:%s,参数2:%s\n", arg1, arg2); return 0; }
- 编译主程序时绑定MODULE:
CRTPGM PGM(MYLIB/MAINPGM) MODULE(MYLIB/MAIN MYLIB/MYMODULE)
内容的提问来源于stack exchange,提问作者Sfp
相关产品推荐
相关产品推荐

