본문 바로가기

예전/API

[API] LRESULT 와 HRESULT


LRESULT 와 HRESULT



HRESULT


HRESULT는 반환형중 하나로 본 목적은 외부와 내부 코드의 충돌예방을 위해 코드의 에러를 배치하는 것이였다.

HRESULT내에는 에러코드의 본형과 출처에 대한 다양한 비트정보를 가지고 있다. 이는 보통 COM프로그래밍에 들어간다. 

COM 프로그래밍인터페이스에 소속된 대부분의 함수는 HRESULT 의 반환값을 가진다.


일반 반환형과 똑같이 사용하며 리턴 형은 SUCCEEDED/FAILED 이다. 하지만 굳이 값을 받지는 않아도 된다.


사용 예 1과 2의 결과물 차이는 없다. 


특별히 알아둬야 할 것은 보통  TRUE/FALSE가 1/0인데에 반해 SUCCEEDED/FAILED는 0/1의 값을 가지고 있다는 것이다.

HRESULT 함수를 사용하는 이유는 디버깅에 용이하기 때문이란다.



HRESULT 의 구조


Bit

31

30

29

28

27

262524232221201918

17

161514131211109876543210
FieldSRCNXFacilityCode


0 부터 15 비트 까지는 Code Field 이고, 16부터 26 비트까지는 Facility Field 이고, 나머지는 저렇게 된다.


 아래는 HRESULT 구조에 대한 설명이다.


 Field

 설명

 S

 Severity - 함수의 성공과 실패를 알려준다.

( return : 0 - 성공, 1 - 실패 )

 R

 식별코드의 예약부분

( return : 1 - 실패)

 C

 Customer - 그 값이 사용자 정의 인지 아닌지 식별하는 비트

( return : 1 - 사용자 정의 )

 N

 식별코드의 예약부분, 상태값 발견을 위해 쓰인다.

 X

 식별코드의 예약부분

 Facility

 에러를 담당하는 시스템 서비스를 알려준다. 식별 코드는 아래와 같다.

1 - RPC

2 - Dispatch

3 - Storage

4 - ITF

7 - Win32

8 - Windows

9 - SSPI

10 - Control

11 - CERT

 Code

 Facility 의 상태 코드



S - Severity - indicates success/fail

0 - Success

1 - Failure

R - Reserved portion of the facility code, corresponds to NT's second severity bit.

1 - Severe Failure

C - Customer. This bit specifies if the value is customer-defined or Microsoft-defined.

0 - Microsoft-defined

1 - Customer-defined

N - Reserved portion of the facility code. Used to indicate a mapped NT status value.

X - Reserved portion of the facility code. Reserved for internal use. Used to indicate HRESULT values that are not status values, but are instead message ids for display strings.

Facility - indicates the system service that is responsible for the error. Example facility codes are shown below (for the full list see ).

1 - RPC

2 - Dispatch

3 - Storage

4 - ITF

7 - Win32

8 - Windows

9 - SSPI

10 - Control

11 - CERT

...

Code - is the facility's status code



HRESULT의 상태 정보 요약

 S_OK

 때때로 Boolean TRUE 값(0x00)으로  함수가 실패 하였음을 의미한다

 E_UNEXPRCTED 

 치명적인 실패를 의미 한다   

 E_NOTIMPL

 멤버 함수에 구현 코드가 포함되어 잇지 않다   
 E_OUTOFMEMORY  

 필요한 메모리를 할당할수 없음  

 E_INVALIDARG     하나혹은 그 이상의 인자가 타당하지 않음  

 E_NOINTERFACE

 요청한 인터페이스를 지원 하지 않음

 E_POINTER 

 타당하지 않은 포인터

 E_HANDLE 

 타당하지 않은 처리

 E_ABORT

 작동 중지

 E_FAIL 

 특정하지 않은 실패

 E_ACCESSDENIED 

 일반적인 접근이 금지된 에러




LRESULT


 LRESULT는 long 변수의 다른 이름일 뿐이다. long이라는 리턴값을 쓰지 않고 굳이 LRESULT라고 재 선언한 것은 이 값이 리턴 값임을 좀 더 명확히 나타내기 위한 것이다.


 이는 메시지처리를 마친 후 운영체제에 어떤 신호를 주기위해 사용되는 값으로 -1, 0 , 1 혹은 비트플래그 형식을 반환한다. 또는 포인터를 캐스팅해서 반환하기도 한다. 이는 포인터가 4byte이기에 가능하다. 윈도우 프로그램에서는 LRESULT 값으로 객체의 포인터를 반환하는 것을 볼 수 있다. 

 0 을 리턴하면 함수가 모든 메시지를 처리할테니 운영체제에 더이상 메시지에 대한 처리를 하지 말라는 것이고, -1은 때때로 운영체제가 진행하던 작업을 취소시킨다는 의미도 있다.





[참고] HRESULT와 LRESULT|작성자 인생이별거냐

[참고] http://en.wikipedia.org/wiki/HRESULT