Home | History | Annotate | Download | only in Windows
      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 
     11 extern HINSTANCE g_hInstance;
     12 #ifndef _UNICODE
     13 extern bool g_IsNT;
     14 #endif
     15 
     16 namespace NWindows {
     17 
     18 #ifndef _UNICODE
     19 
     20 static 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(size - 1), size);
     29   }
     30   while (size - len <= 1);
     31   s.ReleaseBuf_CalcLen(len);
     32   return s;
     33 }
     34 
     35 #endif
     36 
     37 static const int kStartSize = 256;
     38 
     39 static 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(size - 1), size);
     47   }
     48   while (size - len <= 1);
     49   s.ReleaseBuf_CalcLen(len);
     50 }
     51 
     52 // NT4 doesn't support LoadStringW(,,, 0) to get pointer to resource string. So we don't use it.
     53 
     54 UString 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 
     75 void 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 
     98 void MyLoadString(UINT resourceID, UString &dest)
     99 {
    100   MyLoadString(g_hInstance, resourceID, dest);
    101 }
    102 
    103 }
    104