SetDlgItemText 用垃圾填充编辑字段
SetDlgItemText fills edit field with junk
在我的 CDialog 派生 class 中,在 OnInitDialog()
方法中,我使用从预先存在的配置加载的先前配置预填充编辑字段。
SetDlgItemText(IDC_EDIT1, LPCTSTR(data->project_file.c_str()));
SetDlgItemText(IDC_EDIT2, LPCTSTR(data->remote_addr.c_str()));
project_file
和 remote_addr
都是 std::string
类型。它们被正确填充,包含相关文件名和主机名的字符串(在调试器下检查)。
不过,对话框项分别显示 㩆慜瑩噜獩楳屭獁整屲浴㙰䌷⹃浴瑩c췍췍췍췍췍췍﷽﷽翹
和 㤱⸲㘱⸸⸰㐷촀췍
。当我将数据输入其中时,可以正确读取它们,并且相对轻松地将它们的数据转换为std::string。
我做错了什么?
因为在我的编译中 LPCTSTR 是 16 位的,std::string 的 8 位 c_str() 被误解了。它必须转换为 wstring,并且只有 c_str() 可以正确设置值。
#include <locale>
void MyDialog::SetDlgItemStdString(UINT id, std::string entry)
{
#ifndef UNICODE
SetDlgItemText(id, LPCTSTR(entry.c_str()));
#else
std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> conv;
std::wstring entry_wstring = conv.from_bytes(entry);
SetDlgItemText(id, LPCTSTR(entry_wstring.c_str()));
#endif
}
在我的 CDialog 派生 class 中,在 OnInitDialog()
方法中,我使用从预先存在的配置加载的先前配置预填充编辑字段。
SetDlgItemText(IDC_EDIT1, LPCTSTR(data->project_file.c_str()));
SetDlgItemText(IDC_EDIT2, LPCTSTR(data->remote_addr.c_str()));
project_file
和 remote_addr
都是 std::string
类型。它们被正确填充,包含相关文件名和主机名的字符串(在调试器下检查)。
不过,对话框项分别显示 㩆慜瑩噜獩楳屭獁整屲浴㙰䌷⹃浴瑩c췍췍췍췍췍췍﷽﷽翹
和 㤱⸲㘱⸸⸰㐷촀췍
。当我将数据输入其中时,可以正确读取它们,并且相对轻松地将它们的数据转换为std::string。
我做错了什么?
因为在我的编译中 LPCTSTR 是 16 位的,std::string 的 8 位 c_str() 被误解了。它必须转换为 wstring,并且只有 c_str() 可以正确设置值。
#include <locale>
void MyDialog::SetDlgItemStdString(UINT id, std::string entry)
{
#ifndef UNICODE
SetDlgItemText(id, LPCTSTR(entry.c_str()));
#else
std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> conv;
std::wstring entry_wstring = conv.from_bytes(entry);
SetDlgItemText(id, LPCTSTR(entry_wstring.c_str()));
#endif
}