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 12extern bool g_IsNT; 13#endif 14 15namespace NWindows { 16namespace NError { 17 18static 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 43UString 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