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 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Field | S | R | C | N | X | Facility | Code |
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
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
'예전 > API' 카테고리의 다른 글
[API] IME에서 좌상단에 네모칸 없애기 (0) | 2012.11.19 |
---|---|
[API] 프로세스 (0) | 2012.10.22 |
[API] Message Deadlocks ( 메시지 데드락 ) (0) | 2012.06.27 |
[API] 모달 과 모달리스의 차이 (modal modeless) (0) | 2012.06.27 |
[API] Virtual Key Value (0) | 2012.05.13 |