2013-09-30 2 views
1

내 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)을 사용합니다.

답변

1

언어 환경 (LE)에서 실행 중이라고 가정합니다.

그렇다면 언어 환경 조건 처리기가 원하는 것을 수행 할 수 있어야합니다.

PL/I 또는 DLL을 사용하여이 작업을 수행하지 않았습니다. 특정 조건만으로 처리기를 설정할 수 있습니다. CEE3GRN을 사용하여 조건을 유발하는 프로그램의 루틴 이름을 가져올 수 있습니다. 일단 조건을 처리하면 피하고자하는 것을 부드럽게 계속 진행할 수 있고, 조건을 다음 통제 수준으로 "퍼콜 레이션 (percolating)"하여 다른 모듈에서 같은 유형의 다른 조건을 처리 할 수 ​​있습니다. 이는 언어 특정 조건 PL/I ON과 같은 취급.

다양한 언어 환경 설명서와 함께 여러 가지 프레젠테이션을 사용할 수 있습니다. PL/I (및 C 및 COBOL)에는 예제 프로그램이 있습니다. 좋아하는 엔진으로 "언어 환경 조건 처리"를 검색하십시오.

1

필자는 PL/I 전문가가 아니지만 DLL 호출을 메인 블록과 별도의 블록으로 분리 할 수 ​​있습니까? 그렇다면 그 하위 블록에 대해 only in effect이라는 ON 단위를 추가로 가질 수 있다고 생각합니다.

또는 condition handling built-in functions 중 하나를 사용하여 어떤 종류의 오류가 발생했는지 확인할 수 있습니다. 아마도 ONCODE()의 결과를 확인하여 이것이 8094 or 8095인지 확인하십시오.

0

ON 오류 처리 함수 내에서 ONLOC 및/또는 ONCODE PL/I Builtin 함수를 사용해 보았습니까?

C++ 랩퍼 대신 PL/I 코드의 조각 예제를 업로드하면 도움이 될 수도 있습니다.