Home | History | Annotate | Download | only in Windows
      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 m;
     46   if (!MyFormatMessage(errorCode, m) || m.IsEmpty())
     47   {
     48     char s[16];
     49     for (int i = 0; i < 8; i++)
     50     {
     51       unsigned t = errorCode & 0xF;
     52       errorCode >>= 4;
     53       s[7 - i] = (char)((t < 10) ? ('0' + t) : ('A' + (t - 10)));
     54     }
     55     s[8] = 0;
     56     m.AddAscii("Error #");
     57     m.AddAscii(s);
     58   }
     59   else if (m.Len() >= 2
     60       && m[m.Len() - 1] == 0x0A
     61       && m[m.Len() - 2] == 0x0D)
     62     m.DeleteFrom(m.Len() - 2);
     63   return m;
     64 }
     65 
     66 }}
     67