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
MyFormatMessage(DWORD errorCode,UString & message)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
MyFormatMessage(DWORD errorCode)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