PL/I モジュールから外部 DLL を呼び出しています。DLL は配列へのポインターを入力として受け取り、出力配列への別のポインターをエラー メッセージとリターン コードと共に返します。
DLL から返されたリターン コードに基づいて、(PL/I モジュールで) 適切なエラー処理を実行しました。しかし、配列へのポインターが使用されているため、DLL CSECT 自体で S0C4 (つまり、メモリ/ポインターの実行) が発生する可能性があります。残念ながら、私は DLL のソース コードを持っていません (IP の権利のためにブラック ボックスのように扱う必要があるため)。これは、例外処理が DLL 自体の中で行われたかどうかを保証することができます。したがって、現在、DLL 内で例外が発生した場合、エラーはメイン モジュールの ON ERROR ブロックによってすぐにキャプチャされ、バッチは PLIDUMP/CEEDUMP を発行します。
PLIDUMP を発行する代わりに、DLL 内でメモリの問題が発生したレコードを単に無視し、いくつかのエラー メッセージを書き込んで、残りのレコードを続行できるように、エラー処理を変更したいと考えています。 CEEDUMP。
ON ERROR ブロックから PLIDUMP への呼び出しを削除すると、PL/I コードから他の問題 (データの不一致、つまり S0C7 など) の PLIDUMP を取得できなくなります。
私の質問は次 のとおりです。PL/I モジュールから TCB にアクセスして、どの CSECT からエラーが発生したかを特定する方法はありますか?
それ以外の場合は、以下のように DLL に C++ ラッパーを記述します。
#include "dllexp.h"
#pragma export(CARSDLL)
int DLLEXPORT CARSDLL(
double *dpInputVector, int iInputVectorLength,
double *dpOutputVector, int iOutputVectorLength,
char *szMsgBuffer, int iMsgBufferLength)
{
return risks_msg(dpInputVector, iInputVectorLength,
dpOutputVector, iOutputVectorLength,
szMsgBuffer, iMsgBufferLength);
}
次に、aacatch(std::bad_alloc)
を使用してメモリ例外を処理します。