gpt4 book ai didi

c - 使用外部 DLL 时 PL/I 中的错误处理?

转载 作者:太空宇宙 更新时间:2023-11-04 02:54:29 24 4
gpt4 key购买 nike

我正在从我的 PL/I 模块中调用一个外部 DLL。 DLL 将一个指向数组的指针作为输入,并返回另一个指向输出数组的指针,以及错误消息和返回代码。

我已根据从 DLL 返回的返回码进行了适当的错误处理(在我的 PL/I 模块中)。但是由于使用了指向数组的指针,我可能有机会在 DLL CSECT 本身中获得 S0C4(即内存/指针执行)。不幸的是,我没有 DLL 的源代码(由于 IP 权利,我们必须将其视为黑盒),我可以保证 DLL 本身是否已完成异常处理。因此,目前如果我在 DLL 中遇到异常,该错误会被我的主模块的 ON ERROR block 直接捕获,并且批处理会发出 PLIDUMP/CEEDUMP。

我希望以这样一种方式更改我的错误处理方式,即我可以简单地忽略在 DLL 中出现内存问题的记录,然后写出一些错误消息并继续处理其余记录,而不是发出PLIDUMP 或 CEEDUMP。

如果我从我的 ON ERROR block 中删除对 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);
}

然后使用一个catch(std::bad_alloc)来处理内存异常。

最佳答案

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

如果是这样,语言环境条件处理程序可以/应该执行您想要的操作。

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

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

关于c - 使用外部 DLL 时 PL/I 中的错误处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19095926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com