선 밖에 선 자유인

윈도우에서 에러 처리 본문

IT/System & Network

윈도우에서 에러 처리

Hotman 2011. 2. 8. 19:23

윈도우 error.cpp

 #include <windows.h>
 #include <stdio.h>

 // 윈도우에서의 에러처리
 // 1. 스레드당 1개의 에러 코드가 필요 하다.
 // 2. GetLastError() 사용.
 // Helper.h 헤더를 만들어서 아래 함수 2개를 복사

 void ReportError( const char* msg )
 {
       DWORD e = GetLastError();
       char* s;
       FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
                         0, // 문자열을 담은 DLL 핸들
                         e, // 에러 번호
                         0, // 언어(0 디폴트 언어(OS사용하는 언어, 한글))
                        (char*)&s, 256, // 문자열을 담아올 버퍼, **버퍼을 할당해 올때는 이중포인터로 전달    
                        0);
       printf("%s : %s\n", msg, s);
       LocalFree( s );
 }
 void ErrorQuit( const char* msg )
 {
       ReportError( msg );
       ExitProcess( 0); // 프로세스 종료 함수.
 }


 int main()
 {
       HWND hwnd = CreateWindow(0,0,0,0,0,0,0,0,0,0,0); // 0 11개
       if ( hwnd == 0)
       {
              ReportError("CreateWindow Error");
              DWORD e = GetLastError();
              printf("실패 : %d\n", e);

               //char s[256] = {0};
              char* s;
              FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM |  
                                       FORMAT_MESSAGE_ALLOCATE_BUFFER,
                                       0, // 문자열을 담은 DLL 핸들
                                       e, // 에러 번호
                                       0, // 언어(0 디폴트 언어(OS사용하는 언어, 한글))
                                       (char*)&s, 256, // 문자열을 담아올 버퍼
                                      // 버퍼을 할당해 올때는 이중포인터로 전달
                                      0);

              printf("%s\n", s );

              // FormatMessage() 는 내부적으로 LocalAlloc() 이라는 함수로 할당합니다
              LocalFree( s );
       }
}
// 프로젝트 메뉴 - 속성 - 구성속성에서 문자집합 을 멀티 바이트 셋으로




Helper.h

 #ifdef UNICODE
 #undef UNICODE
 #endif

 #ifdef _UNICODE
 #undef _UNICODE
 #endif 

 #include <windows.h>
 #include <stdio.h>

 // 윈도우에서의 에러처리
 // 1. 스레드당 1개의 에러 코드가 필요 하다.
 // 2. GetLastError() 사용.
 // Helper.h 헤더를 만들어서 아래 함수 2개를 복사

 void ReportError( const char* msg )
 {
       DWORD e = GetLastError();
       char* s;
       FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
                         0, // 문자열을 담은 DLL 핸들
                         e, // 에러 번호
                         0, // 언어(0 디폴트 언어(OS사용하는 언어, 한글))
                        (char*)&s, 256, // 문자열을 담아올 버퍼, **버퍼을 할당해 올때는 이중포인터로 전달    
                        0);
       printf("%s : %s\n", msg, s);
       LocalFree( s );
 }
 void ErrorQuit( const char* msg )
 {
       ReportError( msg );
       ExitProcess( 0); // 프로세스 종료 함수.
 }



error.cpp

  // error.cpp
 #include <stdio.h>
 #include <errno.h>
 #include <string.h>
 // 1. C언어 에서의 에러 처리 기법
 //    (A) 실패시 리턴값으로 알려준다.(0 또는 -1)
 //    (B) errno 전역변수에 에러의 원인이 들어 있다.
 //    (C) strerror(), perror()
 //    (D) 단점 - errno 가 전역변수이다.
 int main()
 {
       FILE* f = fopen("a.txt", "rt" );

       if ( f == 0 )
      {
            printf("실패\n");
            printf("실패의 이유 : %d\n", errno ); // errno 미리 정의된 전역변수
            // 실패의 이유가 들어 있다.
            printf("%s\n", strerror( errno ) );
            perror("FAIL"); // fprintf(stderr, "FAIL : %s\n", strerror(errno))의 의미
      }

 }



Comments