在大型機上用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例程的參數的手冊嗎?
編輯:我確實有一個支持票與供應商打開,但他們還沒有迴應任何有用的東西。
謝謝,大衛
什麼是異味?什麼程序中的位移?爲什麼要用「價值」來評估所有事情,我只會認爲只是比較類型,其他的參考?你知道那是什麼嗎?忘記'SYNCHRONIZED'。爲什麼WS-前綴爲您的LINKAGE SECTION項目?嚴格地說,您應該始終將WS-RETURN設置爲GOBACK之前的某個值。企業COBOL的哪個版本?來自C的調用來自DLL嗎?您是否詢問過供應商(您的許可證包括支持)。 –
在一小時內完成23個視圖,以及兩個upvotes。這是一個哇!對於COBOL問題。可能意味着比COBOL人更多的C閱讀,以及比大型機更多的非大型機:-) –
你的'PROGRAM-ID'是什麼?出口意味着是靜態鏈接的還是供應商例行的'獲取您的cobol-dll? –