You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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声明直接调用,性能更高:

  1. 先把被调用程序编译为*MODULE对象:CRTCMOD MODULE(MYLIB/MYMODULE) SRCFILE(MYLIB/QCSRC)
  2. 主程序代码如下:
#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;
}
  1. 编译主程序时绑定MODULE:CRTPGM PGM(MYLIB/MAINPGM) MODULE(MYLIB/MAIN MYLIB/MYMODULE)

内容的提问来源于stack exchange,提问作者Sfp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:15:04