gpt4 book ai didi

C -> 大型机上的 COBOL 跨语言通信

转载 作者:太空狗 更新时间:2023-10-29 15:03:34 26 4
gpt4 key购买 nike

大型机上用 C 语言编写的供应商包提供了通过用户导出覆盖其部分功能的选项。提供的 C 函数原型(prototype)为:

extern int SomeExit (void * Parameters,
void * Record1,
void * Record2,
char ComparisonType,
char * RankString,
void * NotUsed1,
int * NotUsed2)

因为我们主要是一家 COBOL 商店,所以我定义了一个企业 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) 中给出的约定和这个旧的 SHARE 演示文稿中的示例: http://www-01.ibm.com/support/docview.wss?uid=swg27003846&aid=1但是生成的程序在调用退出时和在我的 DISPLAY 消息之前异常终止。我的假设是我没有正确声明接收数据结构。下面是我当前测试代码的一个片段(忽略我的命名约定——这是一个证明接口(interface)的原型(prototype),一旦我的基本调用工作正常,它将被重写为我们的内部标准)。

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 原型(prototype):

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 -> 大型机上的 COBOL 跨语言通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40390918/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com