제프리 리처의 Windows Via C/C++ 를 참고하였으며.

   

마소에서 제공하는 윈도우 API 들의 에러를 처리하는 부분에 대해서 간략히 포스팅하겠다.

   

호출된 함수는 전달된 인자의 유효성을 확인한 뒤 함수의 기능을 수행하게 되는데

인자가 유효하지 않거나 어떠한 이유로 인해서 수행할 수 없다면 함수는 실패를 반환한다.

   

자료형

실패 했을 때의 값

VOID

이 함수는 절대 실패하지 않는다.

아주 적은 수의 윈도우 함수만 VOID 형의 반환 자료형을 가진다.

BOOL

함수가 실패하면 0, 성공 시 0이 아닌 값을 반환한다.

반환 값을 TRUE와 비교하면 안되고, FALSE 와 비교를 해야한다.

HANDLE

함수가 실패하면 반환 값은 대부분 NULL 을 반환한다.

성공 시엔 유효한 오브젝트 핸들을 반환한다.

몇몇 들은 -1로 명시된 INVALID_HANDLE_VALUE 를 반환한다.

(이 부분에 대해선 각 함수의 MSDN 문서를 참고하자)

PVOID

함수가 실패하면 NULL 을 반환하고, 성공 시 PVOID가 데이터를 저장하고 있는 메모리 주소를 가리킨다.

LONG / DWORD

까다로운 형태다.

보통 LONG이나 DWORD형으로 개수를 반환한다.

(잠재적인 에러방지를 위해 어떤 값인지는 함수마다 다르니 MSDN 참고하자.)

   

함수가 기능을 수행하지 못하고 실패하였을 때

개발자는 왜 실패했는지에 대해서 알아야 한다.

MS는 그 실패 원인에 대해 발생할 수 있는 모든 에러 코드를 32비트 숫자로 정의해 두었다.

   

함수가 실패 했을 때 함소를 호출한 쓰레드 지역 저장소(TLS) 에 적절한 에러코드를 저장해둔다.

   

그렇기에 여러 개의 쓰레드가 동시에 수행되더라도 각각의 쓰레드 별로 에러코드를 유지할 수 있다.

실패 했을 때 에러코드를 확인하기 위해선 GetLastError() 함수를 호출하면 된다.

   

에러 코드를 확인하기 위해선 바로 GetLastError() 를 호출해야 한다.

만약, 다른 함수를 호출하게 되면 다른 함수의 수행결과가 덮어 써진다.

   

함수 호출이 성공하면 ERROR_SUCCESS를 반환한다.

   

또, 몇몇의 윈도우 함수들은 성공이유에 대해서도 에러코드를 정의해 두었다.

예를 들어 명명된 이벤트 커널 오브젝트를 생성하는 함수의 경우

새로운 커널 오브젝트가 새로 생성되는 경우 외에도(이미 생성되어 있는 경우)도

성공을 반환하게 된다.

(이러한 부분은 함수의 MSDN 문서를 참고하도록 하자.)

   

VS 의 Watch 창에서 쓰레드의 에러코드를 확인할 수 있다.

   

Error Lookup 이란 유틸로 에러코드에 대한 정보를 확인할 수 있다.

'Programing > Win32API' 카테고리의 다른 글

바이트 순서 ( 엔디언 표기법 )  (0) 2015.11.18
CreateProcess , CreateThread  (0) 2015.09.26
프로세스와 쓰레드  (0) 2015.09.26
대화상자 모달, 모달리스  (0) 2015.09.19
윈도우 기반의 TCP 소켓 통신 ( C )  (0) 2015.09.12

+ Recent posts