Я вызываю внешнюю DLL из моего модуля PL/I. DLL принимает указатель на массив в качестве входных данных и возвращает другой указатель на выходной массив вместе с сообщением об ошибке и кодом возврата.
Я сделал подходящую обработку ошибок (в моем модуле PL/I) на основе кода возврата, который я получаю из DLL. Но поскольку используется указатель на массивы, могут быть шансы, что я смогу получить S0C4 (т.е. исключения памяти/указателя) в самой DLL CSECT. К сожалению, у меня нет исходного кода для DLL (поскольку мы должны обращаться с ним как с черным ящиком из-за прав IP), что я могу гарантировать, если обработка исключений была выполнена в самой DLL. Итак, в настоящее время, если я получаю исключение внутри DLL, ошибка сразу фиксируется моим блоком ON ERROR моего основного модуля, и пакет выдает PLIDUMP/CEEDUMP.
Я хочу изменить свою обработку ошибок таким образом, чтобы я мог просто игнорировать записи, для которых у меня возникают проблемы с памятью внутри DLL, затем выводить некоторые сообщения об ошибках и просто продолжать работу с остальными записями вместо выдачи PLIDUMP или CEEDUMP.
Если я уберу вызов PLIDUMP из моего блока ON ERROR, то я не получу PLIDUMP для других проблем (скажем, таких как несоответствие данных, то есть S0C7) из моего кода PL/I.
Итак, мои вопросы: Может ли доступ к TCB из моего модуля PL/I быть способом, с помощью которого я могу определить, из какого CSECT я получаю свою ошибку?
В противном случае я думаю, что напишу обертку C++ поверх моей DLL, как показано ниже:
#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);
}
а затем используйте a catch(std::bad_alloc)
для обработки исключений памяти.