wstring в LPCWSTR не работает с c_str ()

0

В настоящее время я делаю 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();

Может кто-нибудь объяснить мне, что не так с моим кодом?

Теги:
c++11
visual-c++
directx
directx-11

1 ответ

2
Лучший ответ

WidenString() возвращает значение wstring по значению. В первом фрагменте wndClassEx.lpszClassName укажет на допустимое место памяти, пока переменная str останется в области видимости, то есть она не будет уничтожена.

Во втором случае возвращаемое значение выходит за пределы области действия в конце выражения (в ;) и wndClassEx.lpszClassName затем указывает на недопустимую память.

  • 0
    Понятно ... Спасибо за объяснение! Как мне это решить?
  • 2
    @TerenceLam Сложно сказать, как именно решить проблему, не зная, где используется код. Если вы сразу передаете структуру WNDCLASSEX чему-то вроде RegisterClassEx , то первая опубликованная версия - это способ ее решения. В общем случае время жизни возвращаемого значения из WidenString должно быть, по крайней мере, таким же, как и у экземпляра структуры WNDCLASSEX .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню