|
이경석 님이 쓰신 글 :
: COM 객체는 try ~ catch 로 잡을수 없는지 궁금합니다.
:
: 예를 들어 ( 너무 코드에 신경 쓰지 마세요. )
:
: --------------------------------------------------------------------------------
: IAbcPtr* pAbc;
:
: CoCreateInstance(CLSID_Abc, NULL, CLSCTX_INPROC_SERVER, IID_IAbc, (void**)&pAbc);
:
: try
: {
: pAbc->Method1(param1);
: pAbc->Method2(param2);
: }
: catch(Exception& e)
: {
: ShowMessage("에러발생");
: }
: --------------------------------------------------------------------------------
:
: 위와 같은 방법으로 하면 만약 Method1() 에서 에러가 나면 HRCHECK 라는 타이틀의
: 대화상자가 나타나서 예, 아니오, 취소 버튼중 하나를 누를수 있도록 하게 되거든요.
: utilcls.h에 정의 되어 있더라구요.
:
: 제가 원하는 거는 그런 자체 에러 대화상자 없이 catch 아래의 "에러발생" 이란
: 메세지를 출력 하는 거든요.
:
: 아님 각 메소스마다
: HRESULT hr = pAbc->Method1(param1)
: 이런식으로 추가 해서 hr의 값으로 처리 해야 하는데...쩝....
:
: 고수님들 어드레 방법이 없나요.
:
안녕하세요 정진후라고 합니다.
물론 잡을 수 있는 방법이 있습니다.
호출하시려는 COM관련 동작들을
OleCheck()안에 감싸면 됩니다.
그렇게 했을 경우에 위의 함수는
COM관련 동작을 평가해서 결과 값이 에러일 경우
EOleSysError 에러를 던집니다. 그럼 그 받은 에러로
적절한 평가와 이후 작업을 하시면 되겠습니다.
간단한 예를 들어보면 (역시 코드에는 신경쓰지 마세요)
try {
OleCheck(SOME_COMPO->SOME_FUNC());
}
catch(EOleSysError *e)
{
ShowMessage("["+IntToStr(e->ErrorCode)+ "] " +e->Message);
}
뭐 이러한 형식으로 평가 하시면 되겠는데, 한가지 주의하셔야 할 점은
COM컴퍼넌트를 빌더에서 타입 라이브러리로 불러들이면
원래의 함수 원형과 함께 VB와 같이 쓰기 좋도록 래핑한 함수를
같이 생성하게 됩니다.
위의 수순을 따를때 래핑된 함수를 아래의 예와 같이 그대로 쓰면
OleCheck(retcode = SOME_COMPO->SOMEFUNC());
리턴값이 0일 경우를 제외하고는 무조건 catch블록으로 뛰게 됩니다.
그러니 함수의 원형을 불러서 HRESULT값을 평가하게 하면 되겠습니다.
그럼 도움이 되셨기를 바라며..
|