【问题标题】:wstring to LPCWSTR not working with c_str() [duplicate]wstring 到 LPCWSTR 不适用于 c_str() [重复]
【发布时间】:2013-12-29 19:02:51
【问题描述】:

我目前正在做 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 “ووووووووووووووووووووووووووووووو...” P>

wndClassEx.lpszClassName = WidenString("Hello").c_str();

有人可以向我解释我的代码有什么问题吗?

【问题讨论】:

    标签: c++ visual-c++ c++11 directx directx-11


    【解决方案1】:

    WidenString() 按值返回wstring。在第一个 sn-p 中,wndClassEx.lpszClassName 将指向一个有效的内存位置,只要变量 str 保持在范围内,即它不会被破坏。

    在第二种情况下,返回值确实超出了表达式末尾(;)的范围,wndClassEx.lpszClassName 然后指向无效内存。

    【讨论】:

    • 我明白了...感谢您的解释!我该如何解决?
    • @TerenceLam 如果没有更多关于代码使用位置的上下文,很难说如何准确地解决问题。如果您立即将WNDCLASSEX 结构传递给RegisterClassEx 之类的结构,那么您发布的第一个版本就是解决它的方法。在一般情况下,WidenString 的返回值的生命周期必须至少与 WNDCLASSEX 结构实例的生命周期一样长。
    猜你喜欢
    • 2013-03-22
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 2013-03-25
    • 2022-01-18
    相关资源
    最近更新 更多