1 // Windows/ErrorMsg.h 2 3 #include "StdAfx.h" 4 5 #ifndef _UNICODE 6 #include "../Common/StringConvert.h" 7 #endif 8 9 #include "ErrorMsg.h" 10 11 #ifndef _UNICODE 12 extern bool g_IsNT; 13 #endif 14 15 namespace NWindows { 16 namespace NError { 17 18 static bool MyFormatMessage(DWORD errorCode, UString &message) 19 { 20 LPVOID msgBuf; 21 #ifndef _UNICODE 22 if (!g_IsNT) 23 { 24 if (::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 25 FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 26 NULL, errorCode, 0, (LPTSTR) &msgBuf, 0, NULL) == 0) 27 return false; 28 message = GetUnicodeString((LPCTSTR)msgBuf); 29 } 30 else 31 #endif 32 { 33 if (::FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | 34 FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 35 NULL, errorCode, 0, (LPWSTR) &msgBuf, 0, NULL) == 0) 36 return false; 37 message = (LPCWSTR)msgBuf; 38 } 39 ::LocalFree(msgBuf); 40 return true; 41 } 42 43 UString MyFormatMessage(DWORD errorCode) 44 { 45 UString message; 46 if (!MyFormatMessage(errorCode, message)) 47 { 48 wchar_t s[16]; 49 for (int i = 0; i < 8; i++) 50 { 51 unsigned t = errorCode & 0xF; 52 errorCode >>= 4; 53 s[7 - i] = (wchar_t)((t < 10) ? ('0' + t) : ('A' + (t - 10))); 54 } 55 s[8] = '\0'; 56 message = (UString)L"Error #" + s; 57 } 58 return message; 59 } 60 61 }} 62