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