2010. 7. 7. 09:57

윈도우즈 환경에서는 에러번호를 알기 위해 GetLastError()함수를 사용한다.
하지만, DWORD로 넘어오기 때문에 무슨에러인지 알아보기가 어렵다. 그래서 에러번호를 문자열로 바꿔줘야할 필요가 있는데,
이 때 쓰는 함수가 FormatMessage()이다.

OS는 에러 번호를 문자열로 표시 하기위해 테이블을 하나 만들어서 DLL로 관리를 한다.
이 DLL이 Message Dll 이다.

다음은 FormatMessage를 사용하는 예이다.

int main()
{
        setlocale(LC_ALL, "KOREAN");                                                 // printf 에서 unicode 로 한글을 출력 하는 방법이다.
        
         // C++에서는 imbue() 라는 함수로 사용해야 합니다.

        HWND hwnd = CreateWindow( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );         //윈도우 생성

        if ( hwnd == 0 )
        {
                DWORD e = GetLastError();         // 실패의 이유를 조사

                printf("실패 : %d\n", e );
  
                TCHAR* s = 0;

                FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
                0,                                             // 메세지 DLL의 핸들
                e,                                             // 에러 번호
                0,                                             // 
                (TCHAR*)&s, 0,                         // 메세지를 담아올 버퍼
                                                               // 실제로는 이중포인터를 보내지만 함수 모양이 포인터로
                                                               // 만들어져 있으므로 형식은 1차 포인터로 보내야 한다.
                0);                                           //


            _tprintf( _T("%s\n"), s );

               LocalFree( s );                         // FormatMessage()는 LocalAlloc()으로메모리를할당한다.

 }
}

'Programming > Windows System' 카테고리의 다른 글

에러 핸들링  (0) 2010.07.07
Posted by 어북어위크