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

웬디의 기묘한 이야기

페이지 맨 위로 올라가기

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

웬디의 기묘한 이야기

[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() 만 해서 코드 찾아다니지 말고 메시지로 변경해서 쉽게 볼 수 있겠네요


반응형
이 글은 (새창열림) 본 저작자 표시, 비영리, 동일 조건 변경 허락 규칙 하에 배포할 수 있습니다. 자세한 내용은 Creative Commons 라이선스를 확인하세요.
본 저작자 표시
비영리
동일 조건 변경 허락

'⌨ 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)

인기 글

공지사항

태그

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

나의 외부 링크

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

정보

WENDYS의 웬디의 기묘한 이야기

웬디의 기묘한 이야기

WENDYS

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

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

티스토리

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

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.