2016-07-13 88 views
0

在我的CDialog派生類中,在OnInitDialog()方法中,我預填充了編輯字段,其中之前的配置是從預先存在的配置加載的。SetDlgItemText用垃圾填充編輯字段

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。

我在做什麼錯?

回答

0

由於在我的彙編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 
}