COM Error 정보 반환
에러정보 리턴
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::Invoke의 EXCEPTINFO 인자 사용
l 직접 에러 정보 객체를 사용
1. 에러 발생시 ISupportErrorInfo 인터페이스를 구하여 InterfaceSupportsErrorInfo 함수를 호출 -> IErrorInfo를 지원하는지 여부 확인
2. GetErrorInfo를 호출하여 IErrorInfo 인터페이스를 구한 후 IErrorInfo 인터페이스의 메서드를 호출하여 에러정보를 추출
GetSource, GetDescription, GetGUID, GetHelpFile, GetHelpContext 등 이용
출처 : SDS 멀티 캠퍼스 COM & ATL 과정 강좌