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_fileremote_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
}