본문 바로가기

프로그래밍/C++

GetLastError() 리턴값을 문자열로 출력 - FormatMessage




윈도우즈 시스템에서 에러를 체크해주는 GetLastError()


아쉽지만, 리턴값이 DWORD 이다.


물론, 테이블을 확인해서 어떤 에러인지 확인할 수 있지만( http://honestgame.tistory.com/120 )


매번 확인하는게 귀찮을때 문자열로 변환하여 볼 수 있다.


OS에서 Message Dll로 테이블을 관리하고 있는데, FormatMessage()를 이용하면 된다.



함수원형은 다음과 같다.


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
);




이용하여 간단한 예를 들어보면

LPVOID lpMsgBuf;


FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS ,NULL , dwError , MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT) , (LPTSTR) &lpMsgBuf, 0 , NULL );


CString strErrorMsg = (LPCTSTR)lpMsgBuf;


LocalFree( lpMsgBuf );

이런식으로 strErrorMsg 를 출력해주면 된다.


주의할점은 void* 를 마지막에 해지해줘야 한다는점.



1. FORMAT_MESSAGE_ALLOCATE_BUFFER

message의 메모리를 시스템에서 할당을 해달라고 요청하는 부분

이미 할당된 메모리를 사용하는경우엔 해당 플래그를 제거해야 한다.


2. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)

메시지의 언어를 지정해주는 부분입니다. 위와같이 지정 한 경우엔 

제어판에서 설정한 기본 언어로 지정된다.



좀 더 자세한 사항은 msdn를 참조하면 된다.

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

 

'프로그래밍 > C++' 카테고리의 다른 글

[link] C++ Unit Test - VisualStudio  (0) 2017.04.25
C++17 string_view  (0) 2017.04.13
[링크] 최고의 C++ 강의 5개  (0) 2017.02.06
자료구조 SearchTime - map,set,unordered_map  (0) 2017.01.11
C++ 시스템 환경변수 읽어오기  (0) 2017.01.06