1

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)を使用してメモリ例外を処理します。

4

3 に答える 3

1

Language Environment (LE) で実行していると仮定します。

その場合、Language Environment 条件ハンドラーは、必要なことを行うことができます/行う必要があります。

PL/I や DLL でこれを行ったことはありません。特定の条件のみでハンドラーを確立できます。CEE3GRN を使用して、状態の原因となっているプログラムのルーチン名を取得できます。条件が処理されると、回避したいことのスムーズな継続を調整し、条件を次のレベルの制御に「パーコレート」することで、異なるモジュールからの同じタイプの他の条件を処理できます。これは言語固有の条件です。 PL/I ON のように扱えます。

多数のプレゼンテーションに加えて、さまざまな Language Environment マニュアルが用意されています。PL/I (および C と COBOL) のサンプル プログラムがあります。お好きなエンジンで「言語環境条件ハンドリング」を検索してください。

于 2013-10-02T18:31:46.373 に答える
1

私は PL/I の専門家ではありませんが、DLL 呼び出しをメイン ブロックとは別のブロックに分離できますか? もしそうなら、その子孫ブロックでのみ有効な別のONユニットを持つことができると思います.

または、条件処理組み込み関数の 1 つを使用して、発生したエラーの種類を判別できる場合もあります。おそらくONCODE () の結果をチェックして、それが8094 か 8095かを確認しますか?

于 2013-09-30T17:13:48.607 に答える
0

ON ERROR 処理関数内から PL/I 組み込み関数 ONLOC および/または ONCODE を使用してみましたか?

また、C++ ラッパーの代わりに PL/I コードのフラグメント例をアップロードすると役立つ場合もあります。

于 2013-10-02T22:38:02.530 に答える