2016-07-13 7 views
0

In meiner CDialog abgeleiteten Klasse, in der -Methode, ich pre-füllung Bearbeitungsfelder mit vorherigen Konfiguration geladen von bereits vorhandenen Konfig.SetDlgItemText füllt Editierfeld mit Junk

SetDlgItemText(IDC_EDIT1, LPCTSTR(data->project_file.c_str())); 
SetDlgItemText(IDC_EDIT2, LPCTSTR(data->remote_addr.c_str())); 

project_file und remote_addr sind beide vom Typ std::string. Sie sind korrekt gefüllt, mit Strings, die den relevanten Dateinamen und Hostnamen enthalten (unter Debugger überprüft).

Die Dialogelemente zeigen jedoch 㩆慜瑩噜獩楳屭獁整屲浴㙰䌷⹃浴⹰瑩c췍췍췍췍췍췍﷽﷽翹 bzw. 㤱⸲㘱⸸⸰㐷촀췍 an. Wenn ich die Daten in sie eingeben, können sie richtig gelesen werden, und ihre Daten werden relativ schmerzlos in std :: string konvertiert.

Was mache ich falsch?

Antwort

0

Da in meiner Kompilierung LPCTSTR 16 Bit ist, wird die 8-Bit c_str() von std :: string falsch interpretiert. Es muss in wstring konvertiert werden, und nur c_str() davon setzt den Wert korrekt.

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