2016-11-02 12 views
5

メインフレーム上でC言語で書かれたベンダーパッケージは、ユーザー出口を介してその機能の一部をオーバーライドするオプションを提供します。提供されるC関数のプロトタイプは次のとおりです。メインフレーム上のC - > COBOLインター言語通信

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

私たちは主にCOBOL店は、私はIBM ILCガイドで与えられた規則に従うことをしようと、出口を実装する(DLLなど)のEnterprise COBOL 4.2プログラムを定義したとおりである(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コードがそのコードを呼び出そうとしているようです。

Iは、BY VALUEをドロップ(私はデフォルトであることを理解が)BY REFERENCEを使用して実際の構造の定義でPOINTERsの交換などPROCEDURE DIVISION USINGのバリエーションを試みました。 COBOLルーチンに渡されたパラメータをどのように構造化するかについてのマニュアルを誤解しましたか?

編集:私はベンダーとオープンなサポートチケットを持っていますが、まだ役に立たないものは何も返されていません。

おかげで、デビッド私は法案の提案ごとに、呼び出し元の構造のより良い理解に基づくソリューションを決定することができたコメントへの

+1

何が異常終了するのですか?どのようなプログラムのどの位のずれ?なぜ、すべての点で「BY VALUE」なのか、私は比較型のみを考えたでしょう、他はBY REFERENCEですか?あなたはそれが何をしているのか分かりますか? 'SYNCHRONIZED'を忘れてください。あなたのリンクセクションの項目にWS-プレフィックスが付いているのはなぜですか?厳密には、常にWS-RETURNをGOBACKの前に設定する必要があります。どのバージョンのEnterprise COBOL? Cからの呼び出しはDLLから来ていますか?ベンダーに尋ねましたか(ライセンスにはサポートが含まれています)。 –

+2

1時間に23回のビューと2回のアップボート。それはうわーだ! COBOLの質問ですおそらく、COBOLの読者よりもCの方が多く、メインフレームよりもメインフレーム以外であることを意味します:-) –

+0

あなたの 'PROGRAM-ID'は何ですか?出口が静的にリンクされることを意味するのか、ベンダールーチンがあなたのcobol-dllを 'フェッチする 'のですか? –

答えて

4

感謝。ユーザー出口の上に正常に呼び出されたとベンダーのロジックに値を戻したと

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. 

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

解決策:このCのプロトタイプを考えます。コンパイルには以下のパラメータを使用しました。RENT, TRUNC(BIN), DLL,EXPORTALLDYNAM(DLL),RENTをリンクするために使用しました。私のアプリケーションでは必要ではないが、呼び出し元のプログラムが、上記の例の解決策で使用されているように、呼び出されたプログラムの大文字と小文字のルーチン名を期待している場合は、PGMNAME(LONGMIXED)も必要になります。

コメント者の皆様に私の正しい方向への指摘に感謝します。

+1

ソリューションを投稿していただきありがとうございます。私は気づかなかった...前に。パラメータを使用してコードを作成していれば、どこかで何かが詰まってしまいます。あなたはDISPLAY(SYSOUT DDなし)からの出力を見ていませんでしたか?または、コンパイル/リンクされた/バインダーのオプションが異常終了を修正しましたか?とにかく、良い仕事。 –

+0

あなたの答えを「私のために働く」とマークすることをお勧めします;-) –

+1

@BillWoodgerはい...私が持っていた問題には関係なく、パラメータを読み込んだ(しかしそれらを更新しなかった)参照されたロジック。私が変更を加えるまで、それは表示のステートメントには達していませんでした。 –

関連する問題