C - >主机上的COBOL中介语通信

Dav*_*yle 5 c cobol mainframe

在大型机上用C编写的供应商软件包提供了通过用户出口覆盖其部分功能的选项.提供的C函数原型是:

extern int SomeExit (void * Parameters,
                     void * Record1,
                     void * Record2,
                     char ComparisonType,
                     char * RankString,
                     void * NotUsed1,
                     int * NotUsed2)
Run Code Online (Sandbox Code Playgroud)

由于我们主要是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)以及此旧SHARE演示文稿中的示例:http://www-01.ibm.com/support/docview.wss?uid = swg27003846&aid = 1但是结果程序在调用退出时和我的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.
Run Code Online (Sandbox Code Playgroud)

异常是:

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.     
Run Code Online (Sandbox Code Playgroud)

供应商代码动态调用DLL.当我删除DLL时,我收到一条消息,指出无法找到退出,因此看起来C代码正试图调用它.

我尝试了PROCEDURE DIVISION USING包括删除BY VALUE,使用BY REFERENCE(虽然我理解这是默认值)并POINTERs使用实际结构定义替换的变体.我是否误解了有关如何构造传递给COBOL例程的参数的手册?

编辑:我确实有一个与供应商打开的支持票,但他们还没有回复任何有用的东西.

谢谢,大卫

Dav*_*yle 4

感谢这些评论,我能够根据法案建议更好地理解调用结构来确定解决方案。给定这个 C 原型:

extern int SomeExit (void * Parameters,
                     void * Record1,
                     void * Record2,
                     char ComparisonType,
                     char * RankString,
                     void * NotUsed1,
                     int * NotUsed2)
Run Code Online (Sandbox Code Playgroud)

解决方案:

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.
Run Code Online (Sandbox Code Playgroud)

通过上述内容,用户出口已成功调用并向供应商逻辑返回一个值。我使用以下参数进行编译RENT, TRUNC(BIN), DLL,EXPORTALL和链接DYNAM(DLL),RENT。我的应用程序不需要,但如果调用程序需要在被调用程序中使用混合大小写的例程名称(如上面示例解决方案中使用的那样),那么PGMNAME(LONGMIXED)也需要。

感谢所有评论者为我指明了正确的方向。