如何在COBOL中创建带*NOMAIN与可导出过程的*MODULE?
COBOL(IBM i 环境)创建 *SRVPGM 对应 RPGLE 流程的实现
在IBM i的COBOL环境中,实现类似RPGLE创建服务程序(*SRVPGM)的流程,同样对应三个核心环节,以下是具体实现方式:
1. 编写无主程序的COBOL模块源(对应RPGLE的Module Source)
RPGLE中用*NOMAIN标记模块无主程序,COBOL通过不定义主程序入口+ENTRY语句声明可导出过程来实现。这类模块编译后生成*MODULE对象,作为服务程序的组成部分。
示例模块源(成员名:COBMOD01,存于QCBLSRC):
IDENTIFICATION DIVISION. PROGRAM-ID. COBMOD01 NOT INHERITING FROM PROGRAM. * 声明不继承默认主程序属性,避免自动生成主入口 DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-RESULT PIC 9(5). PROCEDURE DIVISION. * 定义第一个可导出过程,符号名为CALC_ADD EXPORTED-ADD. ENTRY "CALC_ADD" USING BY VALUE A B PIC 9(5) RETURNING WS-RESULT. COMPUTE WS-RESULT = A + B. GOBACK. * 定义第二个可导出过程,符号名为CALC_MUL EXPORTED-MUL. ENTRY "CALC_MUL" USING BY VALUE A B PIC 9(5) RETURNING WS-RESULT. COMPUTE WS-RESULT = A * B. GOBACK.
编译命令生成*MODULE:
CRTCOBMOD MODULE(MYLIB/COBMOD01) SRCFILE(MYLIB/QCBLSRC) OPTION(*SHOWINC *SHOWSRCP)
2. 编写绑定源(对应RPGLE的Binder Source)
绑定源用于精确指定服务程序要导出的过程符号,格式与RPGLE的绑定源完全一致(属于IBM i系统级定义,与语言无关)。
示例绑定源(成员名:COBBIND,存于QSRVSRC):
STRPGMEXP PGMLVL(*CURRENT) EXPORT SYMBOL(CALC_ADD) EXPORT SYMBOL(CALC_MUL) ENDPGMEXP
执行命令创建*SRVPGM:
CRTSRVPGM SRVPGM(MYLIB/COBSRV01) MODULE(MYLIB/COBMOD01) BNDSRC(MYLIB/QSRVSRC) TEXT('COBOL 算术运算服务程序')
注:也可通过
CRTSRVPGM的EXPORT(*ALL)参数直接导出模块中所有ENTRY声明的过程,但最佳实践是用绑定源精准控制导出范围,避免暴露内部逻辑。
3. 编写调用程序的原型定义(对应RPGLE的Prototype Source)
在COBOL调用程序中,需通过INTERFACE语句定义服务程序过程的调用接口,确保参数传递和返回值匹配,对应RPGLE的原型定义。
示例调用程序(成员名:COBCALLER,存于QCBLSRC):
IDENTIFICATION DIVISION. PROGRAM-ID. COBCALLER. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-A PIC 9(5) VALUE 10. 01 WS-B PIC 9(5) VALUE 20. 01 WS-RESULT PIC 9(5). * 定义CALC_ADD的调用接口 INTERFACE. IDENTIFICATION DIVISION. PROGRAM-ID. CALC_ADD. DATA DIVISION. LINKAGE SECTION. 01 LK-A PIC 9(5). 01 LK-B PIC 9(5). 01 LK-RESULT PIC 9(5). PROCEDURE DIVISION USING BY VALUE LK-A LK-B RETURNING LK-RESULT. END-INTERFACE. * 定义CALC_MUL的调用接口 INTERFACE. IDENTIFICATION DIVISION. PROGRAM-ID. CALC_MUL. DATA DIVISION. LINKAGE SECTION. 01 LK-A PIC 9(5). 01 LK-B PIC 9(5). 01 LK-RESULT PIC 9(5). PROCEDURE DIVISION USING BY VALUE LK-A LK-B RETURNING LK-RESULT. END-INTERFACE. PROCEDURE DIVISION MAIN. * 调用服务程序的CALC_ADD过程 INVOKE CALC_ADD USING WS-A WS-B RETURNING WS-RESULT. DISPLAY "10 + 20 = " WS-RESULT. * 调用服务程序的CALC_MUL过程 INVOKE CALC_MUL USING WS-A WS-B RETURNING WS-RESULT. DISPLAY "10 * 20 = " WS-RESULT. STOP RUN.
编译调用程序并绑定服务程序:
CRTCOBPGM PGM(MYLIB/COBCALLER) SRCFILE(MYLIB/QCBLSRC) BNDSRVPGM(MYLIB/COBSRV01)
内容的提问来源于stack exchange,提问作者corei
相关产品推荐
相关产品推荐

