// Windows/ResourceString.cpp #include "StdAfx.h" #ifndef _UNICODE #include "../Common/StringConvert.h" #endif #include "ResourceString.h" extern HINSTANCE g_hInstance; #ifndef _UNICODE extern bool g_IsNT; #endif namespace NWindows { #ifndef _UNICODE static CSysString MyLoadStringA(HINSTANCE hInstance, UINT resourceID) { CSysString s; int size = 128; int len; do { size <<= 1; len = ::LoadString(hInstance, resourceID, s.GetBuffer(size - 1), size); } while (size - len <= 1); s.ReleaseBuffer(); return s; } #endif static const int kStartSize = 256; static void MyLoadString2(HINSTANCE hInstance, UINT resourceID, UString &s) { int size = kStartSize; int len; do { size <<= 1; len = ::LoadStringW(hInstance, resourceID, s.GetBuffer(size - 1), size); } while (size - len <= 1); s.ReleaseBuffer(); } // NT4 doesn't support LoadStringW(,,, 0) to get pointer to resource string. So we don't use it. UString MyLoadString(UINT resourceID) { #ifndef _UNICODE if (!g_IsNT) return GetUnicodeString(MyLoadStringA(g_hInstance, resourceID)); else #endif { { wchar_t s[kStartSize]; s[0] = 0; int len = ::LoadStringW(g_hInstance, resourceID, s, kStartSize); if (kStartSize - len > 1) return s; } UString dest; MyLoadString2(g_hInstance, resourceID, dest); return dest; } } void MyLoadString(HINSTANCE hInstance, UINT resourceID, UString &dest) { dest.Empty(); #ifndef _UNICODE if (!g_IsNT) MultiByteToUnicodeString2(dest, MyLoadStringA(hInstance, resourceID)); else #endif { { wchar_t s[kStartSize]; s[0] = 0; int len = ::LoadStringW(hInstance, resourceID, s, kStartSize); if (kStartSize - len > 1) { dest = s; return; } } MyLoadString2(hInstance, resourceID, dest); } } void MyLoadString(UINT resourceID, UString &dest) { MyLoadString(g_hInstance, resourceID, dest); } }