내 PL/I 모듈에서 외부 DLL을 호출합니다. DLL은 배열에 대한 포인터를 입력으로 사용하고 오류 메시지와 반환 코드와 함께 출력 배열에 다른 포인터를 반환합니다.외부 DLL을 사용할 때 PL/I에서 오류를 처리합니까?
DLL에서 돌아 오는 반환 코드를 기반으로 적절한 PL/I 모듈에서 오류 처리를 수행했습니다. 그러나 배열에 대한 포인터가 사용되기 때문에 DLL CSECT 내에서 S0C4 (즉 메모리/포인터 제외)를 얻을 수있는 가능성이 있습니다. 불행히도, 나는 DLL을위한 소스 코드를 가지고 있지 않다. (IP 권한 때문에 블랙 박스처럼 취급해야만한다.) 예외 처리가 DLL 자체 내에서 수행 되었다면 보장 할 수있다. 따라서 현재 DLL 내부에서 예외가 발생하면 오류는 내 주 모듈의 ON 오류 블록에서 캡처되며 일괄 처리는 PLIDUMP/CEEDUMP를 실행합니다.
DLL 내에서 메모리 문제가 발생한 레코드를 무시하고 일부 오류 메시지를 기록한 다음 단순히 레코드 대신 나머지 레코드를 계속 사용하는 방식으로 오류 처리 방식을 변경하고 싶습니다. PLIDUMP 또는 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);
}
다음 메모리 예외를 처리하는 A A catch(std::bad_alloc)
을 사용합니다.