C -> 大型机上的 COBOL 跨语言通信
C -> COBOL interlanguage communication on mainframe
在大型机上用 C 编写的供应商包提供了通过用户出口覆盖其部分功能的选项。提供的C函数原型为:
extern int SomeExit (void * Parameters,
void * Record1,
void * Record2,
char ComparisonType,
char * RankString,
void * NotUsed1,
int * NotUsed2)
因为我们主要是一家 COBOL 商店,所以我定义了一个 Enterprise COBOL 4.2 程序(作为 DLL)来实现出口,试图遵循 IBM ILC 指南中给出的约定(https://www.ibm.com/support/knowledgecenter/en/SSLTBW_1.13.0/com.ibm.zos.r13.ceea400/clcccb5.htm#clcccb5) and the examples in this old SHARE presentation: http://www-01.ibm.com/support/docview.wss?uid=swg27003846&aid=1 但生成的程序是abending 因为它调用退出和在我的 DISPLAY
消息之前。我的假设是我没有正确声明接收数据结构。下面是我当前测试代码的片段(忽略我的命名约定 - 这是一个原型来验证接口,一旦我的基本调用工作正常,就会将其重写为我们的内部标准。
IDENTIFICATION DIVISION.
PROGRAM-ID. "SomeExit".
...
LINKAGE SECTION.
01 WS-PARAMETERS-POINTER USAGE IS POINTER SYNCHRONIZED.
01 SORT-PASS-RECORD1-POINTER USAGE IS POINTER SYNCHRONIZED.
01 SORT-PASS-RECORD2-POINTER USAGE IS POINTER SYNCHRONIZED.
01 WS-COMPARISION-TYPE PIC X.
01 WS-RANK-STRING-POINTER USAGE IS POINTER SYNCHRONIZED.
01 WS-NOT-USED1-POINTER USAGE IS POINTER SYNCHRONIZED.
01 WS-NOT-USED2-POINTER USAGE IS POINTER SYNCHRONIZED.
01 WS-RETURN PIC S9(9) USAGE IS BINARY.
...
PROCEDURE DIVISION USING BY VALUE WS-PARAMETERS-POINTER
SORT-PASS-RECORD1-POINTER
SORT-PASS-RECORD2-POINTER
WS-COMPARISION-TYPE
WS-RANK-STRING-POINTER
WS-NOT-USED1-POINTER
WS-NOT-USED2-POINTER
RETURNING WS-RETURN.
DISPLAY 'IN EXIT'.
...
MOVE 0 TO WS-RETURN.
GOBACK.
异常结束是:
CEE3250C The system or user abend U 016 R=00000000 was issued.
From entry point main at compile unit offset +00000192 at entry offset +00000192 at address 28500ECA.
供应商代码动态调用 DLL。当我删除 DLL 时,我收到一条消息,指出无法找到出口,因此 C 代码似乎正在尝试调用它。
我尝试了 PROCEDURE DIVISION USING
的变体,包括删除 BY VALUE
,使用 BY REFERENCE
(虽然我知道这是默认设置)并将 POINTERs
替换为实际结构定义。我是否误解了有关如何构造传递给 COBOL 例程的参数的手册?
编辑:我确实与供应商有一张支持票,但他们还没有回应任何有用的信息。
谢谢,大卫
多亏了评论,我才能够根据 Bills 的建议更好地理解调用结构来确定解决方案。给出这个 C 原型:
extern int SomeExit (void * Parameters,
void * Record1,
void * Record2,
char ComparisonType,
char * RankString,
void * NotUsed1,
int * NotUsed2)
解决方法:
IDENTIFICATION DIVISION.
PROGRAM-ID. "SomeExit".
...
LINKAGE SECTION.
01 WS-PARAMETERS PIC X(10).
01 SORT-PASS-RECORD1 PIC X(50).
01 SORT-PASS-RECORD2 PIC X(50).
01 WS-COMPARISON-TYPE PIC X.
01 WS-RANK-STRING PIC X(6).
01 WS-NOT-USED1 PIC X.
01 WS-NOT-USED2 PIC X.
01 WS-RETURN PIC S9(9) USAGE IS BINARY.
...
PROCEDURE DIVISION USING
BY REFERENCE WS-PARAMETERS
BY REFERENCE SORT-PASS-RECORD1
BY REFERENCE SORT-PASS-RECORD2
BY VALUE WS-COMPARISON-TYPE
BY REFERENCE WS-RANK-STRING
BY REFERENCE WS-NOT-USED1
BY REFERENCE WS-NOT-USED2
RETURNING WS-RETURN.
DISPLAY 'IN EXIT'.
...
MOVE 0 TO WS-RETURN.
GOBACK.
通过以上操作,成功调用了用户出口并向供应商逻辑返回了一个值。我使用以下参数进行编译 RENT, TRUNC(BIN), DLL,EXPORTALL
和链接 DYNAM(DLL),RENT
。我的应用程序不需要,但如果调用程序期望在上述示例解决方案中使用的被调用程序中有大小写混合的例程名称,那么也需要 PGMNAME(LONGMIXED)
。
感谢所有评论者为我指明了正确的方向。
在大型机上用 C 编写的供应商包提供了通过用户出口覆盖其部分功能的选项。提供的C函数原型为:
extern int SomeExit (void * Parameters,
void * Record1,
void * Record2,
char ComparisonType,
char * RankString,
void * NotUsed1,
int * NotUsed2)
因为我们主要是一家 COBOL 商店,所以我定义了一个 Enterprise COBOL 4.2 程序(作为 DLL)来实现出口,试图遵循 IBM ILC 指南中给出的约定(https://www.ibm.com/support/knowledgecenter/en/SSLTBW_1.13.0/com.ibm.zos.r13.ceea400/clcccb5.htm#clcccb5) and the examples in this old SHARE presentation: http://www-01.ibm.com/support/docview.wss?uid=swg27003846&aid=1 但生成的程序是abending 因为它调用退出和在我的 DISPLAY
消息之前。我的假设是我没有正确声明接收数据结构。下面是我当前测试代码的片段(忽略我的命名约定 - 这是一个原型来验证接口,一旦我的基本调用工作正常,就会将其重写为我们的内部标准。
IDENTIFICATION DIVISION.
PROGRAM-ID. "SomeExit".
...
LINKAGE SECTION.
01 WS-PARAMETERS-POINTER USAGE IS POINTER SYNCHRONIZED.
01 SORT-PASS-RECORD1-POINTER USAGE IS POINTER SYNCHRONIZED.
01 SORT-PASS-RECORD2-POINTER USAGE IS POINTER SYNCHRONIZED.
01 WS-COMPARISION-TYPE PIC X.
01 WS-RANK-STRING-POINTER USAGE IS POINTER SYNCHRONIZED.
01 WS-NOT-USED1-POINTER USAGE IS POINTER SYNCHRONIZED.
01 WS-NOT-USED2-POINTER USAGE IS POINTER SYNCHRONIZED.
01 WS-RETURN PIC S9(9) USAGE IS BINARY.
...
PROCEDURE DIVISION USING BY VALUE WS-PARAMETERS-POINTER
SORT-PASS-RECORD1-POINTER
SORT-PASS-RECORD2-POINTER
WS-COMPARISION-TYPE
WS-RANK-STRING-POINTER
WS-NOT-USED1-POINTER
WS-NOT-USED2-POINTER
RETURNING WS-RETURN.
DISPLAY 'IN EXIT'.
...
MOVE 0 TO WS-RETURN.
GOBACK.
异常结束是:
CEE3250C The system or user abend U 016 R=00000000 was issued.
From entry point main at compile unit offset +00000192 at entry offset +00000192 at address 28500ECA.
供应商代码动态调用 DLL。当我删除 DLL 时,我收到一条消息,指出无法找到出口,因此 C 代码似乎正在尝试调用它。
我尝试了 PROCEDURE DIVISION USING
的变体,包括删除 BY VALUE
,使用 BY REFERENCE
(虽然我知道这是默认设置)并将 POINTERs
替换为实际结构定义。我是否误解了有关如何构造传递给 COBOL 例程的参数的手册?
编辑:我确实与供应商有一张支持票,但他们还没有回应任何有用的信息。
谢谢,大卫
多亏了评论,我才能够根据 Bills 的建议更好地理解调用结构来确定解决方案。给出这个 C 原型:
extern int SomeExit (void * Parameters,
void * Record1,
void * Record2,
char ComparisonType,
char * RankString,
void * NotUsed1,
int * NotUsed2)
解决方法:
IDENTIFICATION DIVISION.
PROGRAM-ID. "SomeExit".
...
LINKAGE SECTION.
01 WS-PARAMETERS PIC X(10).
01 SORT-PASS-RECORD1 PIC X(50).
01 SORT-PASS-RECORD2 PIC X(50).
01 WS-COMPARISON-TYPE PIC X.
01 WS-RANK-STRING PIC X(6).
01 WS-NOT-USED1 PIC X.
01 WS-NOT-USED2 PIC X.
01 WS-RETURN PIC S9(9) USAGE IS BINARY.
...
PROCEDURE DIVISION USING
BY REFERENCE WS-PARAMETERS
BY REFERENCE SORT-PASS-RECORD1
BY REFERENCE SORT-PASS-RECORD2
BY VALUE WS-COMPARISON-TYPE
BY REFERENCE WS-RANK-STRING
BY REFERENCE WS-NOT-USED1
BY REFERENCE WS-NOT-USED2
RETURNING WS-RETURN.
DISPLAY 'IN EXIT'.
...
MOVE 0 TO WS-RETURN.
GOBACK.
通过以上操作,成功调用了用户出口并向供应商逻辑返回了一个值。我使用以下参数进行编译 RENT, TRUNC(BIN), DLL,EXPORTALL
和链接 DYNAM(DLL),RENT
。我的应用程序不需要,但如果调用程序期望在上述示例解决方案中使用的被调用程序中有大小写混合的例程名称,那么也需要 PGMNAME(LONGMIXED)
。
感谢所有评论者为我指明了正确的方向。