관리 메뉴

드럼치는 프로그래머

[API/MFC] HRESULT와 LRESULT 본문

★─Programing/☆─API | MFC

[API/MFC] HRESULT와 LRESULT

드럼치는한동이 2011. 4. 18. 18:44

Win32API 혹은 MFC를 배우다 보면

 

HRESULT라는 반환형이 있습니다.

 

이는 32비트의 signed형 정수이며 COM의 규정에 정의된 것은 아니지만 COM 인터페이스에 소속된

 

대부분의 함수들은 HRESULT형태의 반환값을 가진다고 합니다. (물론 직접 만들어 사용하셔도 됩니다.)

 

어떤 함수가 HRESULT 형태를 사용함으로서 이 함수의 상태 정보를 리턴 받을 수 있게 됩니다.

 

사용방법은 BOOL형의 TRUE/FALSE와 마찬가지로 SUCCEEDED/FAILED를 사용합니다.

 

BOOL형과의 차이점이 있다면 반환형이 HRESULT라고 해서 반드시 값을 리턴받지는 않아도 된다는 겁니다.

 

CreateWindow라는 함수를 예로 들어보겠습니다.

 

if(FAILED(CreateWindow(...))

          MessageBox(L"윈도우 생성에 실패 했습니다.");

 

라는 것과 단순히 CreateWindow(...); 라고 사용하는 것에 결과물은 차이가 없습니다.

 

단지, 전자의 경우 윈도우 생성에 실패하면 메시지를 출력하게 해놓은 것 뿐입니다.

 

여기서 주의할 것은 BOOL형처럼 !를 사용해도 됩니다만, TRUE/FALSE가 1/0인데에 반해 SUCCEEDED/FAILED는

 

0/1의 값을 가지고 있다는 것입니다.

 

저 같은 경우는 HRESULT를 자주 사용합니다. 디버깅이 편하기 때문입니다.

 

위처럼 "윈도우 생성에 실패했습니다"라고 메시지 상자가 뜨면 여기저기 헤멜 필요없이

 

바로 CreateWindow를 보고 위로 한줄씩 검사해보면 어디가 문제인지 금방 찾을 수 있게 되기 때문에

 

저는 HRESULT형을 자주 사용하는 편입니다.

 

* HRESULT 형의 구조


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


* 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 : 일반적 접근이 금지된 에러

 

===========================================================================================

콜백 함수를 보면 반환형이 LRESULT입니다.

 

LRESULT는 long형으로 Win32환경에서 메시지 처리를 마친후 운영체제에게 신호를 주기 위해 사용하는 값입니다.

 

즉, 콜백 함수에서 switch case문에 대한 처리 값을 -1, 0, 1 혹은 비트 플래그로 운영체제에게 어떤 작업을 해야하는지

 

추가로 알려주게 됩니다.

 

0을 리턴하면 모든 메시지가 처리 되었으니 넌 더이상 처리할 메시지가 없다. 라는 뜻이 된다거나

 

진행 중인 작업을 취소해라 라던가 하는 의미를 가지기도 합니다.


Comments