我正在从我的 PL/I 模块调用一个外部 DLL。DLL 将一个指向数组的指针作为输入,并返回另一个指向输出数组的指针,以及错误消息和返回代码。
我已经根据从 DLL 得到的返回代码进行了适当的错误处理(在我的 PL/I 模块中)。但由于使用了指向数组的指针,我可能会在 DLL CSECT 本身中获得 S0C4(即内存/指针执行)。不幸的是,我没有 DLL 的源代码(由于 IP 权利,我们必须将其视为黑匣子),我可以保证异常处理是否已在 DLL 本身内完成。因此,目前如果我在 DLL 中遇到异常,我的主模块的 ON ERROR 块会立即捕获该错误,并且批处理会发出 PLIDUMP/CEEDUMP。
我希望以这样一种方式更改我的错误处理,即我可以简单地忽略我在 DLL 中遇到内存问题的记录,然后写出一些错误消息并继续处理其余记录,而不是发出 PLIDUMP 或CEEDUMP。
如果我从我的 ON ERROR 块中删除对 PLIDUMP 的调用,那么我将不会从我的 PL/I 代码中获得其他问题的 PLIDUMP(比如数据不匹配,即 S0C7)。
所以我的问题是: 从我的 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)
来处理内存异常。