1. 자신만의 에러 코드를 정의하는 법

반환 자료형 

1. VOID - 실패하지 않음. 

2. BOOL - 실패하면 0. 성공시에는 0 이 아닌값. TRUE 와 비교하는게 아니라 FALSE 와 비교하는게 좋은 방법.

3. HANDLE - 실패시 NULL. INVALID_HANDLE_VALUE ( -1 ) 을 리턴하는 경우도 있음.

4. PVOID - 실패시 NULL. 성공시 데이터의 메모리 주소를 가리킴

5. LONG/DWORD - 개수를 반환함. 실패시 0 또는 -1 (함수에 따라 다름) 을 반환.


실패한 원인 파악을 위해 함수 호출 실패시 그 함수를 호출한 스레드의 로컬스토리지에 에러코드를 저장해둠. 


DWORD GetLastError() 로 얻어올 수 있다.


WinError.h 파일에 에러코드의 리스트가 저장되어 있다.

- 성공의 이유가 복수개인 경우에도 위와 같은 방법으로 구분할 수 있다.


Debug 상태에서 확인하려면

Watch 창에서 행선택후 $err,hr 입력 


Visual Studio 에는 Error Loockup 유틸리티가 포함되어있음.

value 값을 넣으면 메시지가 출력됨


에러코드를 텍스트 메시지로 변환하려고 하는 경우


DWORD FormatMessage (

DWORD dwFlags,

LPCVOID pSource,

DWORD dwMessageId,

DWORD dwLanguageId,

PTSTR pszBuffer,

DWORD nSize,

va_list *Arguments);


- 언어 식별자를 인자로 받아 다양한 언어로 문자열 구성 가능.


어플리케이션단에서 이런 메커니즘을 이용할 수 있도록 다음 함수 이용가능


VOID SetLastError(DWORD dwErrCode);


어떠한 32 비트 값도 상관없음. WinErrorh 에 정의되어 있다면 가능한 이 에러코드를 사용하도록 한다.

자신만의 에러코드를 등록하여도 되는데, 32 비트를 여러 필드로 구분하여 의미를 부여한다.


비트 

31-30 

29 

28 

27-16 

15-0 

내용

심각도

마이크로소프트/고객 

예약됨 

식별 코드 

예외 코드 

의미 

0 = 성공

1 = 정보

2 = 주의

3 = 에러

 0 = 마이크로 소프트

1 = 고객

 항상 0

256까지는 예약됨

 정의한 코드