[C/C++] FormatMessage 윈도우 GetLastError를 메시지로!!
GetLastError() code to Message
Windows 프로그램 개발시 API를 사용하다보면 에러가 났을때 문제를 확인하기 위하여 GetLastError() 를 사용합니다.
하지만 해당 API는 DWORD 로 넘어오기때문에 자주 사용해서 기억하는 코드가 아니면
위 사이트를 이용하여 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 |
댓글
이 글 공유하기
다른 글
-
[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