이 블로그 검색

2012년 9월 13일 목요일


Win32API 혹은 MFC를 배우다 보면 HRESULT나 LRESULT라는 반환형이 보입니다.
의외로 유용한 타입들이니 이 타입들이 어떤 역할을 하는지 알아보겠습니다.

HRESULT형은 32비트의 singed형 정수입니다.
COM의 규정에 정의된 것은 아니지만 COM 인터페이스에 소속된 대부분의 함수들은(DirectX가 대표적이죠)
HRESULT형태의 반환값을 가진다고 합니다.( 직접 만들어 사용하셔도 된다고 하지만 저라면 그냥 있는거 쓰겠습니다;; )

이 HRESULT형은 함수의 실행 결과를 리턴하게 됩니다.
주 사용법은 BOOL형과 마찬가지로 실행 결과를 SUCCEEDED / FAILED로 리턴 받을 수 있습니다.
단, BOOL과의 차이점은 반드시 함수의 리턴 값을 받지 않아도 된다는 것입니다.

예를 들면

if( FAILED( CreateWindow( ) )
          MessageBox( L"윈도우 생성에 실패 했습니다." );
라는 것과 단순히
CreateWindow( );
라고 사용하는 것의 결과물은 차이가 없습니다.

단지 전자의 경우 윈도우 생성에 실패하게 되면 오류메시지를 출력하도록 해놓은 것입니다.
이렇게 사용하면 쉽게 틀릴 수 있는 부분을 1차적으로 디버깅 할 수 있습니다.
윈도우 생성이 실패하면 메시지가 출력되기 때문에 CreateWindow 부분이 잘못 되었다는 것을
금방 알아차릴 수 있습니다.

주의할 점은 BOOL형 처럼 !를 사용해서 성공과 실패 여부를 받아도 되지만 BOOL 형에서 TRUE가 1 FALSE가 0인 것에 반해 SUCCEEDED는 0, FAILED는 1의 값을 가지고 있기 때문에 헷갈릴 수 있는 부분입니다.

HRESULT 형을 함수의 반환형으로 자유롭게 사용할 수 있습니다.
리턴 값은 다음과 같습니다.

S_OK : Boolean TRUE 값(0X0)으로 S_FALSE와 함께 사용되며 함수가 성공하였음을 의미한다.
NOERROR : S_OK와 동일한 의미이다.
S_FALSE : S_OK와 반대로 Boolean FALSE 값(0X1)으로 함수가 실폐하였음을 의미한다.
E_UNEXPRCTED : 치명적인 실패를 의미한다.
E_NOTIMPL : 멤버 함수에 구현 코드가 포함되어 있지 않다.
E_OUTOFMEMORY : 필요한 메모리를 할당할 수 없음
E_INVALIDARG : 하나 혹은 그 이상의 인자가 타당하지 않음
E_NOINTERFACE : 요청한 인터페이스를 지원하지 않음
E_POINTER : 타당하지 않은 포인터
E_HANDLE : 타당하지 않은 처리
E_ABORT : 작동 중지
E_FAIL : 특정하지 않은 실패
E_ACCESSDENIED : 일반적 접근이 금지된 에러

주로 return S_OK와 return E_FAIL을 사용하게 됩니다.

다음은 HRESULT형의 구조입니다.

* HRESULT 형의 구조

0~15 비트 : RETURN CODE
16~28 비트 : FACILITY
29~30 비트 : R
31 비트 : SEVERITY ( SEVERITY(31비트)는 함수의 수행의 성공과 실패를 알려주는 코드다. )

다음으로 LRESULT라는 타입이 있습니다.
이것은 long형으로 Win32환경에서 메시지 처리를 마친 후 운영체제에게 신호를 주기 위해 사용하는 값이라고 합니다.

대표적으로 콜백함수의 반환형이 LRESULT이죠.
switch case문에서 각 메시지에 대한 처리 값을 -1, 0, 1 혹은 비트 플래그로 운영체제에게 어떤 작업을 해야하는지 추가로 알려주게 됩니다.

0을 리턴하면 모든 메시지가 처리 되었으니 넌 더이상 처리할 메시지가 없다.
라는 뜻이된다거나 진행 중인 작업을 취소해라 라던가 하는 의미를 가지기도 합니다.

댓글 없음:

댓글 쓰기