3. Implementation/COM & ActiveX

COM Error 정보 반환

SSKK 2009. 3. 9. 14:00

에러정보 리턴

 

l       자동화 객체에서는 IErrorInfo 객체를 생성하여 여기에 발생한 에러에 대한 자세한 정보를 제공

l       자동화 객체는 ISupportErrorInfo 인터페이스를 지원해야 함

 

에러정보 리턴

    에러 정보를 반환하는 방법은 아래와 같다.

l       CreateErrorInfo SetErrorInfo 함수 이용

STDMETHODIMP CAddBack::AddEnd(short newval)

{

    AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

    if(newval < 1) {

        CComPtr<ICreateErrorInfo> spCreateErrInfo;

        CComQIPtr<IErrorInfo, &IID_IErrorInfo> spErrInfo;

 

        HRESULT hr = ::CreateErrorInfo(&spCreateErrInfo);

        if(SUCCEEDED(hr))

        {

            spCreateErrInfo->SetSource(OLESTR("AddBack.AddBack.1"));

            spCreateErrInfo->SetDescription(OLESTR("0 보다큰값을입력하십시오!"));

            spErrInfo = spCreateErrInfo;

            ::SetErrorInfo(0, spErrInfo);

        }

        return E_INVALIDARG;

    }

 

    return S_OK;

}

 

l       CComCoClass::Error 함수 이용

STDMETHODIMP CAddBack::AddEnd2(short newval)

{

    AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

    if(newval < 1)

    {

        return Error("0보다큰값을입력하십시오!", IID_IAddBack, E_INVALIDARG);

    }

 

    return S_OK;

}

 

l       AtlReportError 함수 이용

STDMETHODIMP CAddBack::AddEnd3(short newval)

{

    AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

    if(newval < 1)

    {

        return AtlReportError(GetObjectCLSID(), L"0보다큰값을입력하시오!", IID_IAddBack, E_INVALIDARG);

    }

 

    return S_OK;

}

 

 

 

에러 정보 받기

l       IDispatch::InvokeEXCEPTINFO 인자 사용

l       직접 에러 정보 객체를 사용

1.       에러 발생시 ISupportErrorInfo 인터페이스를 구하여 InterfaceSupportsErrorInfo 함수를 호출 -> IErrorInfo를 지원하는지 여부 확인

2. GetErrorInfo를 호출하여 IErrorInfo 인터페이스를 구한 후 IErrorInfo 인터페이스의 메서드를 호출하여 에러정보를 추출

GetSource, GetDescription, GetGUID, GetHelpFile, GetHelpContext 등 이용

 

출처 : SDS 멀티 캠퍼스 COM & ATL 과정 강좌