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()));
您知道wstring
、LPWSTR
、c_str
是做什么的吗?或者您是否正在通过反复试验进行编程?
@Greg:这个答案是不必要的复杂。在 MFC 中有 CStringT 类模板,它提供了您所需要的所有转换工具。而且由于您可以在任何需要 C 样式字符串(包括变量参数列表)的地方传递 CString
,这确实是您所需要的。
【参考方案1】:
你为什么不使用
CString str = _T("Hello world!") ;
【讨论】:
这不会从std::string
转换而来(以防您对否决感到疑惑)。
问题不是“我应该使用std::string
吗?”。问题是 “我有一个 std::string
并且需要转换为宽字符串。我该怎么做?” 无论如何,我真的应该停止离开 cmets,解释为什么我对答案投了反对票.它总是导致解释两次。以上是关于MFC:无法将 std::string 转换为 LPWSTR 放入函数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
将 std::string 转换为 const tchar*