2016-11-02 38 views
5

在大型機上用C編寫的供應商軟件包提供了通過用戶出口覆蓋其功能的一部分的選項。所提供的C函數原型爲:C - > COBOL在主機上的中介語通信

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消息之前調用。我的假設是我沒有正確地聲明接收數據結構。下面是我當前測試代碼的一部分(忽略我的命名約定 - 這是一個證明接口的原型,一旦我的基本呼叫工作,它將被重寫到我們的內部標準)。

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例程的參數的手冊嗎?

編輯:我確實有一個支持票與供應商打開,但他們還沒有迴應任何有用的東西。

謝謝,大衛

+1

什麼是異味?什麼程序中的位移?爲什麼要用「價值」來評估所有事情,我只會認爲只是比較類型,其他的參考?你知道那是什麼嗎?忘記'SYNCHRONIZED'。爲什麼WS-前綴爲您的LINKAGE SECTION項目?嚴格地說,您應該始終將WS-RETURN設置爲GOBACK之前的某個值。企業COBOL的哪個版本?來自C的調用來自DLL嗎?您是否詢問過供應商(您的許可證包括支持)。 –

+2

在一小時內完成23個視圖,以及兩個upvotes。這是一個哇!對於COBOL問題。可能意味着比COBOL人更多的C閱讀,以及比大型機更多的非大型機:-) –

+0

你的'PROGRAM-ID'是什麼?出口意味着是靜態鏈接的還是供應商例行的'獲取您的cobol-dll? –

回答

4

感謝我能夠確定基於更好地瞭解每條例草案建議調用結構的解決方案的意見。鑑於該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)

感謝所有評論者指引我在正確的方向。

+1

感謝您發佈解決方案。我沒有注意到......之前。如果你有使用參數的代碼,你可能會在某處破壞某些東西。你有沒有看到DISPLAY(no SYSOUT DD?)的輸出?或者編譯/鏈接/綁定選項修復了異常?無論如何,好的工作。 –

+0

我建議將你的答案標記爲「適合我」;-) –

+1

@BillWoodger是......參考邏輯,它讀取參數(但沒有更新它們),與我遇到的問題無關。直到我做出改變,它沒有得到顯示聲明。 –