이 영역을 누르면 첫 페이지로 이동
웬디의 기묘한 이야기 블로그의 첫 페이지로 이동

웬디의 기묘한 이야기

페이지 맨 위로 올라가기

웬디의 기묘한 이야기

C/C++ Windows Hooking 개발자의 블로그 입니다! 이곳은 개발 외에도 저의 취미들이 공유되는 기묘한 이야기가 펼쳐집니다.

[C/C++] FormatMessage 윈도우 GetLastError를 메시지로!!

  • 2015.12.29 22:46
  • ⌨ DEVELOPMENT/C++
반응형

GetLastError() code to Message


Windows 프로그램 개발시 API를 사용하다보면 에러가 났을때 문제를 확인하기 위하여 GetLastError() 를 사용합니다.

하지만 해당 API는 DWORD 로 넘어오기때문에 자주 사용해서 기억하는 코드가 아니면

MSDN HOME
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms681381(v=vs.85).aspx

위 사이트를 이용하여 Error Number와 Message를 비교해야 합니다.


이 때, 디버그 로그를 기록하거나 메시지를 바로바로 보고싶은 경우 이러 번거로움을 해소하기 위하여 FormatMessage API를 사용합니다.


Windows 는 Error Number를 문자열로 변경하기 위해 테이블로 만들어 DLL로 관리하게 되는데 이 DLL이 Message DLL 입니다.


원형은 다음과 같습니다.


DWORD WINAPI FormatMessage(
    _In_     DWORD   dwFlags,
    _In_opt_ LPCVOID lpSource,
    _In_     DWORD   dwMessageId,
    _In_     DWORD   dwLanguageId,
    _Out_    LPTSTR  lpBuffer,
    _In_     DWORD   nSize,
    _In_opt_ va_list *Arguments
);

사용법은 다음과 같습니다.


DWORD example_error = 0x5;
TCHAR* message = nullptr;

FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
                            nullptr,
                            example_error,
                            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                            (TCHAR *)&message,
                            0,
                            nullptr);

// ...

LocalFree(message);


이렇게 하면 GetLastError() Code가 0x5 이면 "액세스가 거부되었습니다.\r\n" 라는 결과값이 나오게 됩니다.


여기서 주의해야 할 부분은


1. FORMAT_MESSAGE_ALLOCATE_BUFFER

message의 메모리를 시스템에서 할당을 해달라고 요청하는 부분이며, 이미 할당된 메모리를 사용하는경우엔 해당 플래그를 제거해야합니다.


2. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)

메시지의 언어를 지정해주는 부분입니다. 위와같이 지정 한 경우엔 사용자가 제어판에서 설정한 기본 언어로 지정됩니다.


3. LocalFree

FORMAT_MESSAGE_ALLOCATE_BUFFER를 플래그로 지정한경우엔 사용자가 직접 메모리를 해제해주어야 메모리 릭이 발생하지 않습니다.


정도가 되겠습니다.


이제 GetLastError() 만 해서 코드 찾아다니지 말고 메시지로 변경해서 쉽게 볼 수 있겠네요


반응형
저작자표시 비영리 동일조건 (새창열림)

'⌨ DEVELOPMENT > C++' 카테고리의 다른 글

[C/C++] 작업표시줄 아이콘 깜빡이게 하기 (FlashWIndow)  (0) 2019.07.03
[C++] std::string to std::wstring 서로 변환하기  (3) 2016.01.31
[C/C++] DLL injection. 다른 Process에 내 DLL Load 하기  (5) 2016.01.03
__cdecl, __stdcall, __fastcall x86 호출 규약(Calling Convention)  (4) 2016.01.01
[C/C++] IPC - Pipe client simple example  (0) 2015.12.28
[C/C++] IPC - Pipe server simple example  (1) 2015.12.21
[C/C++] string replace all 문자열 모두 치환  (0) 2015.12.11
[C/C++] 폴더 전체 경로 중 파일명만 가져오기  (0) 2015.12.10

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [C/C++] DLL injection. 다른 Process에 내 DLL Load 하기

    [C/C++] DLL injection. 다른 Process에 내 DLL Load 하기

    2016.01.03
  • __cdecl, __stdcall, __fastcall x86 호출 규약(Calling Convention)

    __cdecl, __stdcall, __fastcall x86 호출 규약(Calling Convention)

    2016.01.01
  • [C/C++] IPC - Pipe client simple example

    [C/C++] IPC - Pipe client simple example

    2015.12.28
  • [C/C++] IPC - Pipe server simple example

    [C/C++] IPC - Pipe server simple example

    2015.12.21
다른 글 더 둘러보기

정보

웬디의 기묘한 이야기 블로그의 첫 페이지로 이동

웬디의 기묘한 이야기

  • 웬디의 기묘한 이야기의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록
  • 이야기

카테고리

  • 분류 전체보기 (204)
    • MY STORY (2)
    • 📸 WALKING WITH YOU (85)
      • 아이슬란드 신혼여행 이야기 (14)
      • 대한민국 구석구석 (62)
      • CONTAX N1 + T* 28-80mm (4)
      • SAMSUNG NX3000 (1)
      • 어느 멋진 날 (4)
    • ⌨ DEVELOPMENT (80)
      • BOOK:Review (1)
      • AI (13)
      • C++ (26)
      • Python (10)
      • WIndows Hooking (9)
      • Windows Kernel (3)
      • Design Pattern (3)
      • Debugging (9)
      • Tools (0)
      • Project (1)
      • Android (1)
      • 상업용 무료폰트 (4)
    • OS (4)
      • News (0)
      • Windows 일반 (4)
    • 모바일 (2)
      • 모바일 게임 (2)
    • 멘사 퍼즐 (9)
    • 생활 꿀 TIP (7)
      • 건강 (3)
      • 일상 (2)
    • 물생활 (8)
      • 골든볼 라미네지 롱핀 (8)
    • IT 기기 (2)
    • BLOG (4)
      • TISTORY BLOG TIP (3)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • AI
  • 신혼여행
  • 카페
  • c
  • c++
  • 해외여행
  • windbg
  • 아이슬란드

나의 외부 링크

  • kernel undocument api
  • 지구 관찰자의 일기
  • 지구와 지구곰

정보

WENDYS의 웬디의 기묘한 이야기

웬디의 기묘한 이야기

WENDYS

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © WENDYS. Designed by Fraccino.

티스토리툴바