1

我正在从我的 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)来处理内存异常。

4

3 回答 3

1

我假设您在语言环境 (LE) 下运行。

如果是这样,语言环境条件处理程序可以/应该做你想做的事。

我没有用 PL/I 做过这个,也没有用 DLL 做过。您可以建立仅具有特定条件的处理程序。您可以使用 CEE3GRN 获取导致该条件的程序的例程名称。处理条件后,您可以为要避免的情况安排平稳的延续,并通过将条件“渗透”到下一个控制级别来处理来自不同模块的相同类型的其他条件,这将是任何特定于语言的条件像您的 PL/I ON 一样处理。

有许多可用的演示文稿,以及各种语言环境手册。PL/I(以及 C 和 COBOL)中有示例程序。用你喜欢的引擎搜索“语言环境条件处理”。

于 2013-10-02T18:31:46.373 回答
1

我不是 PL/I 专家,但你能将你的 DLL 调用隔离到与你的主块分开的块中吗?如果是这样,我相信您可以拥有另一个对该后代块有效的 ON 单元。

或者,您可以使用其中一个条件处理内置函数来确定发生了哪种错误。也许检查ONCODE () 的结果以查看它是8094 还是 8095

于 2013-09-30T17:13:48.607 回答
0

您是否尝试过在 ON ERROR 处理函数中使用 PL/I 内置函数 ONLOC 和/或 ONCODE?

如果您上传 PL/I 代码的片段示例而不是 C++ 包装器,它也可能会有所帮助。

于 2013-10-02T22:38:02.530 回答