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