반응형

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



 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 |작성자 살발해

반응형

+ Recent posts