1// Windows/ResourceString.cpp
2
3#include "StdAfx.h"
4
5#ifndef _UNICODE
6#include "../Common/StringConvert.h"
7#endif
8
9#include "ResourceString.h"
10
11extern HINSTANCE g_hInstance;
12#ifndef _UNICODE
13extern bool g_IsNT;
14#endif
15
16namespace NWindows {
17
18#ifndef _UNICODE
19
20static CSysString MyLoadStringA(HINSTANCE hInstance, UINT resourceID)
21{
22  CSysString s;
23  int size = 128;
24  int len;
25  do
26  {
27    size <<= 1;
28    len = ::LoadString(hInstance, resourceID, s.GetBuf((unsigned)size - 1), size);
29  }
30  while (size - len <= 1);
31  s.ReleaseBuf_CalcLen((unsigned)len);
32  return s;
33}
34
35#endif
36
37static const int kStartSize = 256;
38
39static void MyLoadString2(HINSTANCE hInstance, UINT resourceID, UString &s)
40{
41  int size = kStartSize;
42  int len;
43  do
44  {
45    size <<= 1;
46    len = ::LoadStringW(hInstance, resourceID, s.GetBuf((unsigned)size - 1), size);
47  }
48  while (size - len <= 1);
49  s.ReleaseBuf_CalcLen((unsigned)len);
50}
51
52// NT4 doesn't support LoadStringW(,,, 0) to get pointer to resource string. So we don't use it.
53
54UString MyLoadString(UINT resourceID)
55{
56  #ifndef _UNICODE
57  if (!g_IsNT)
58    return GetUnicodeString(MyLoadStringA(g_hInstance, resourceID));
59  else
60  #endif
61  {
62    {
63      wchar_t s[kStartSize];
64      s[0] = 0;
65      int len = ::LoadStringW(g_hInstance, resourceID, s, kStartSize);
66      if (kStartSize - len > 1)
67        return s;
68    }
69    UString dest;
70    MyLoadString2(g_hInstance, resourceID, dest);
71    return dest;
72  }
73}
74
75void MyLoadString(HINSTANCE hInstance, UINT resourceID, UString &dest)
76{
77  dest.Empty();
78  #ifndef _UNICODE
79  if (!g_IsNT)
80    MultiByteToUnicodeString2(dest, MyLoadStringA(hInstance, resourceID));
81  else
82  #endif
83  {
84    {
85      wchar_t s[kStartSize];
86      s[0] = 0;
87      int len = ::LoadStringW(hInstance, resourceID, s, kStartSize);
88      if (kStartSize - len > 1)
89      {
90        dest = s;
91        return;
92      }
93    }
94    MyLoadString2(hInstance, resourceID, dest);
95  }
96}
97
98void MyLoadString(UINT resourceID, UString &dest)
99{
100  MyLoadString(g_hInstance, resourceID, dest);
101}
102
103}
104