http://blog.naver.com/maelblood/20161497755
Direct에서 Com 객체를 사용하다 보니 HRESULT를 사용하게 되었다.
HRESULT : 32bit signed 정수형이다.
HRESULT는 반환형 중 하나이다.
COM규정에 의한 것은 아니지만 COM Interface에 소속된 대부분의 함수들은 HRESULT의 반환값을 가진다.
이렇게 대부분 COM Interface에 소속된 함수들이 반환형으로 HRESULT를 사용함으로 클라이언트에게 일관성 있는
함수의 정보를 전달할 수 있게 된다.
HRESULT의 원래 목적은 공식적으로 OS/ 2 운영 체제의 여러 하위 시스템에 오류 코드간의 충돌을 방지하기 위해
내부공개와 MS 모두 사용하기 위해 오류 코드의 범위를 배치하는 것이었다.
HRESULT내에는 에러코드의 본형과 출저에 대한 다양한 비트정보를 가지고 있다.(보통 COM 프로그래밍)
사용방법은 bool형의 true / false 똑같이 SUCCEEDED/FAILED를 사용한다.
bool형과 차이점이 있다면 굳이 리턴 값을 받지 않아도 되는 것이 다른 점이다.
Device초기화 하려고 GetDeviceCaps 함수로 장치 가져오기를 할때
if(FAILED(P3D->GetDeviceCaps(.....)))
{
MessageBox(L"장치 가져오기 실패!!");
return E_FAIL;
}
return S_OK;
이런식으로 사용이 가능 합니다.
디바이스 장치 가져오기가 실패를 하면 메시지를 출력하게 한 것인데 디버깅이 편리합니다.
(HRESULT 함수를 사용하는 이유는 디버깅이 용이하기 때문)
주의할 점
bool형은 true/ false 가 1/0 이지만 HRESULT의 SUCCEEDED/FAILED는 0/1의 값을 가지고 있는 점이 다른 점입니다.
HRESULT 의 구조
Bit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 12 | 13 | 14 | 15 | -> | |||||||||||||||
Field | Code |
Bit | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Field | Facility | X | N | V | R | S |
Field | 설명 |
S | Severity - 함수의 성공과 실패를 알려준다. (return : 0 - 성공과 실패를 알려준다.) |
R | 실별코드의 예약부분 (return : 1 - 실패) |
C | Customer - 그 값이 사용자 정의 인지 아닌지 식별하는 비트 (return : 1 - 사용자 정의) |
N | 식별코드의 예약부분, 상태값 발견을 위해 쓰인다. |
X | 식별코드의 예약부분 |
Facility | 에러를 담당하는 시스템 서비스를 알려준다. 식별 코드는 아래와 같다. ① RPC ② Dispatch ③ Storage ④ ITF ⑤ ⑥ ⑦ Win32 ⑧ windows ⑨ SSPI ⑩ Control ⑪ CERT |
Code | Facility의 상태 코드 |
HRESULT의 상태 정보 요약
S_OK | 때때로 Boolean TRUE 값(0x00)으로 S_FALSE와 함께 사용되며 함수가 성공하였음을 의미 한다. |
NOERROR | S_OK와 동일한 의미 이다. |
S_FALSE | S_OK와 반대로 Boolean FALSE 값(0x01)으로 함수가 실패 했음을 의미 한다. |
E_OUTOFMEMORY | 필요한 메모리를 할당할 수 없음 |
E_NOTIMPL | 멤버 함수에 구현 코드가 포함되어 있지 않다. |
E_UNEXPRCTED | 치명적인 실패를 의미한다. |
E_INVALIDARG | 하나 혹은 그 이상의 인자가 타당하지 않음 |
E_NOINTERFACE | 요청한 인터페이스를 지원하지 않음 |
E_POINTER | 타당하지 않은 포인터 |
E_HANDLE | 타당하지 않은 처리 |
E_ABORT | 작동 중지 |
E_FAIL | 특정하지 않은 실패 |
E_ACCESSDENIED | 일반적인 접근이 금지된 에러 |
LRESULT : long타입, Win32 환경에서 메시지 처리를 마친 후 OS에게 신호를 주기 위한 값
LRESULT는 long 변수의 다른 이름일 뿐이다. long 이라는 리턴값을 쓰지 않고 LRESULT라고
재 선언한 것은 이 값이 리턴 값임을 좀 더 명확히 나타내기 위한 것이다.
Win32 API에서 CALLBACK함수 앞에는 LRESULT가 반환된다.
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMessage, WPARAM wParam,.....)
{
....
}
LRESULT의 반환값은 무엇일까?
LRESULT는 long 타입형으로 Win32 환경에서 메시지 처리를 마친후 O/S 에게 어떤 신호를 주기위해 사용되는 값이다.
각각의 메시지 case에 대한 처리 값이 때로는 단순히 -1, 0, 1 등으로 어떤 때는 비트 플래그로 O/S 가 알수 있게 설정한다.
또는 포인터를 캐스팅해서 반환하기도 한다. 이는 포인터가 4Byte이기 가능하다. 윈도우 프로그램에서는 LRESULT값으로
객체의 포인터를 반환하는 것을 볼 수있다.
0을 리턴하면 OS는 더이상 메시지에 대한 처리를 하지 않고 프로그래머가 직접 처리한다는 의미를 갖는다.
-1을 반환할때도 있는대 이 경우 O/S가 진행하던 작업을 취소시키는 의미를 갖는다.
[출처] HRESULT / LRESULT |작성자 살발해
'그래픽스(Graphics) > DirectX9~12' 카테고리의 다른 글
D3DLIGHT9 광원 (0) | 2013.01.02 |
---|---|
Device 초기화, D3DPRESENT_PARAMETERS d3dpp (0) | 2012.12.30 |
FPS 와 프레임 즉시 렌더링 (0) | 2012.12.27 |
renderState를 쉽게 조작하기 IDirect3DStateBlock9 (0) | 2012.12.22 |
소프트 파티클 (0) | 2012.12.20 |