MFC:无法将 std::string 转换为 LPWSTR 放入函数 [重复]

Posted

技术标签:

【中文标题】MFC:无法将 std::string 转换为 LPWSTR 放入函数 [重复]【英文标题】:MFC: Cannot put convert std::string to LPWSTR into a function [duplicate] 【发布时间】:2016-06-30 09:14:20 【问题描述】:

我正在用 Visual Studio 2015 编写一个 MFC 项目,字符集配置为“使用 Unicode 字符集”

我需要从std::string 转换为LPWSTR 以与CListCtrl 中的LVITEM::pszText 等一些MFC 对象属性一起使用,AfxMessageBox,...所以我使用来自互联网的这个片段:

String str = "Hello world!";
std::wstring wname(str.begin(), str.end());
LPWSTR lStr = const_cast<wchar_t*>(wname.c_str());
MessageBox(lStr);

这种方法效果很好。但问题是每次我需要转换时,我都必须重写这些语句,并将这个片段放入一个函数中:

LPWSTR convertLPWSTR(std::string &str) 
    std::wstring wname(str.begin(), str.end());
    return const_cast<wchar_t*>(wname.c_str());

/...
String str = "Hello world!";
LPWSTR lStr = convertLPWSTR(str);
MessageBox(lStr);

但消息框输出错误字符串(如错误字体):

有人知道如何解决这个问题吗?谢谢!

【问题讨论】:

我会推荐使用 [link](***.com/a/27296/6460438) 关于你的实现的几点说明:1 看来是通过简单地加宽数据类型(完全忽略字符编码) 很难杀死。别这样了。它不像你期望的那样工作。 2 您的 convertLPWSTR 实现返回一个指向本地对象的指针。那是未定义的行为。 3 解决方法很简单:MessageBox(CString(str.c_str())); 您知道wstringLPWSTRc_str 是做什么的吗?或者您是否正在通过反复试验进行编程? @Greg:这个答案是不必要的复杂。在 MFC 中有 CStringT 类模板,它提供了您所需要的所有转换工具。而且由于您可以在任何需要 C 样式字符串(包括变量参数列表)的地方传递 CString,这确实是您所需要的。 【参考方案1】:

你为什么不使用

CString str = _T("Hello world!") ;

【讨论】:

这不会从std::string 转换而来(以防您对否决感到疑惑)。 问题不是“我应该使用std::string吗?”。问题是 “我有一个 std::string 并且需要转换为宽字符串。我该怎么做?” 无论如何,我真的应该停止离开 cmets,解释为什么我对答案投了反对票.它总是导致解释两次。

以上是关于MFC:无法将 std::string 转换为 LPWSTR 放入函数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 C 风格的字符串转换为 C++ std::string

将 std::string 转换为 const tchar*

如何将 ATL/MFC CString 转换为 QString?

如何将 std::string 转换为 WCHAR

将 void* 转换为 std::string

无法从 'const std::string [3]' 转换为 'std::string'