В настоящее время я делаю DirectX11 и пытаюсь преобразовать строку UTF8 в LPCWSTR. Я написал функцию полезности, которая поможет мне в преобразовании:
// Convert an UTF8 string to a wide Unicode String
std::wstring WidenString(const std::string &string)
{
int size_needed = MultiByteToWideChar(CP_UTF8, 0, string.c_str(), string.size(), NULL, 0);
std::wstring wstring(size_needed, 0);
MultiByteToWideChar(CP_UTF8, 0, string.c_str(), string.size(), &wstring[0], size_needed);
return wstring;
}
Я использовал отладчик, чтобы проверить, работает ли он. Это работает:
Отладчик говорит wndClassEx.lpszClassName = L "Hello"
std::wstring str = WidenString("Hello");
wndClassEx.lpszClassName = str.c_str();
Это не работает:
Отладчик говорит, что wndClassEx.lpszClassName = L "ووووووووووووووووтворазвитие..."
wndClassEx.lpszClassName = WidenString("Hello").c_str();
Может кто-нибудь объяснить мне, что не так с моим кодом?
WidenString()
возвращает значение wstring
по значению. В первом фрагменте wndClassEx.lpszClassName
укажет на допустимое место памяти, пока переменная str
останется в области видимости, то есть она не будет уничтожена.
Во втором случае возвращаемое значение выходит за пределы области действия в конце выражения (в ;
) и wndClassEx.lpszClassName
затем указывает на недопустимую память.
WNDCLASSEX
чему-то вродеRegisterClassEx
, то первая опубликованная версия - это способ ее решения. В общем случае время жизни возвращаемого значения изWidenString
должно быть, по крайней мере, таким же, как и у экземпляра структурыWNDCLASSEX
.