embelog
Chapter1. 에러 핸들링 본문
1. 윈도우 함수의 대표적인 반환 자료형
자료형 | 실패했을때 값 |
BOOL | FALSE, 결과 비교시 TRUE 가 아닌 FALSE 랑 비교 해야함 |
HANDLE | NULL or INVALID_HANDLE_VALUE(-1) |
PVOID | NULL |
LONG/DWORD | 함수별로 각기 다름( SDK 문서 확인 필요) |
2. 윈도우 함수 실패 시 에러코드 확인법
DOWRD GetLastError();
에러코드를 확인하기 위해 GetLastError()함수를 호출한다.
에러코드는 함수를 호출한 쓰레드의 TLS에 저장되는데, GetLastError() 함수는
TLS로 부터 에러코드를 가져온다.
3. 윈도우 함수 실패 시 주의 사항
윈도함수 실패 시 바로 GetLastError 함수를 호출해야 한다.
실패 했음에도 불구하고, 에러코드를 확인하지 않고
다른 윈도우 함수를 호출했을 경우, 이전에 실패한 함수의 에러코드는 다른 윈도우 함수 호출로 인해 덮혀 씌어질 수 있기 때문이다.
Remarks
Functions executed by the calling thread set this value by calling the SetLastError function. You should call the GetLastError function immediately when a function's return value indicates that such a call will return useful data. That is because some functions call SetLastError with a zero when they succeed, wiping out the error code set by the most recently failed function.
출처:http://docs.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-getlasterror
몇몇 윈도우 함수의 경우 성공했음에도 불구하고 GetLastError함수를 호출하는 경우가 있다.
예를 들어 두번 연속으로 CreateEvent 함수를 호출하면 이에 대한
에러 코드로 ERROR_ALREADY_EXIST가 셋되는 경우가 있다.
이를 통해 부가적인 성공 이유를 전달 받을 수 있다.
4. Visual Studio에서 Debug 모드시, 에러코드 확인 방법
Debug Watch 창에 $err,hr 추가하면, Error값과, 이에 대한 설명을 볼수 있다.
'Windows Via C++' 카테고리의 다른 글
Chapter3. 커널 오브젝트1 (0) | 2021.05.03 |
---|---|
Chapter2. 문자와 문자열로 작업하기 (0) | 2021.04.18 |
Chapter15. VirtualAlloc (0) | 2021.03.21 |