Problem string nach LPCWSTR
-
hi
ich habe den Versuch gestartet ein Programm zu schreiben das eine Datei ausliest und dann den Inhalt anzeigt. Das hat auch im "Konsolenmodus" (oder wie man das immer nennt gefunzt. Dann wollte ich ein Fenster machen in dem Der Text steht und da ist das Problem. ob mit TextOut oder DrawText, ich bekomme immer die Fehlermeldung: "Konvertierung des Parameters 2 von 'std::string' in 'LPCWSTR' nicht möglich" Ich habe es schon mit umwandeln probiert aber der kompiler sagt dann das der cast-operator nicht vorhanden sei(oder ähnliches) was habe ich falsch gemacht??
-
LPCWSTR kommt aus der WinAPI und diese kommt aus C-Zeiten. Also haben Funktionen in der WinAPI keine Ahnung von std::string (und selbst wenn würden sie wohl nicht diese Stringklasse verwenden...).
Seis drum, du musst aus dem std::string den C-String rausbekommen:
string stdString = "Hallo"; const char* raw = stdString.c_str();Problem in dem Fall: Du hast es mit LPCWSTR zu tun -> einem String der auf 2-Byte-Zeichen basiert. Du müsstest also den erhaltenen C-String mit einer geeigneten Funktion in einen neuen Wide-Character-String umwandeln (wenn du das häufig machst wird dir ordentlich Performance flöten gehen).
Die logische Konsequenz ist hier also std::string zu ersetzen (an der WinAPI kannst du nichts drehen, und die Non-Unicode-Version empfehle ich sicher nicht mehr).
Heißt für dich entweder kompletter Verzicht auf std::string und eigene Stringklasse, oder:
typedef std::basic_string<wchar_t> wstring; wstring mywidestr; std::getline(mywidestr, wcin); // wcin!! Auch wcout! const LPCWSTR raw = mywidestr.c_str(); TextOut(..., raw, ...);MfG SideWinder
-
was spricht dagegen, einfach std::wstring zu nutzen? also anstelle da selbst mit typedef hand anzulegen? Und sonnst mach dir doch, wenn de schon bei typedef bist lieber ne TCHAR Version ...
-
(D)Evil schrieb:
was spricht dagegen, einfach std::wstring zu nutzen? also anstelle da selbst mit typedef hand anzulegen? Und sonnst mach dir doch, wenn de schon bei typedef bist lieber ne TCHAR Version ...
War mir nicht sicher ob es überhaupt std::wstring gibt. Wenn das der Fall ist gehört mein typedef natürlich ersetzt.
TCHAR-Version wär nett, dann aber bitte auch gleich noch mit defines für tcout und tcin.
MfG SideWinder
-
ich blicke nicht mehr ganz durch soll ich jetzt alle string durch wstring ersetzen?? ich benutze eine eigene Funktion zum auslesen:
wstring MyReadFile(void) { wstring test ; ifstream in("C:\\test.dat"); char c; while(!in.eof()) { ch=in.get(); test += c ; } return test; }ist dies so richtig?? (glaube nicht)
-
nee muss nen wistream sein ... und dann nen wchar_t anstelle eines chars ... dann sollte das gehen ...
-
Also so:
wstring MyReadFile(void) { wstring test ; wifstream in("C:\\test.dat"); wchar_t c; while(!in.eof()) { ch=in.get(); test += c ; } return test; }
-
naja wenn de jedes Zeichen einzeln lesen willst ... jop.
std::wstring read_file(const std::string& filename) { std::wifstream in_stream(filename.c_str(), std::ios::in); std::wstring string_content; if (!in_stream) return string_content: while (in_stream.eof() == false) string_content += in_stream.get(); return string_content; }?
-
aber das Problem scheint damit leider nicht gelöst ich bekomme beim kompilieren immer noch ne Reklammation das ich keinen LPCWSTR habe oder hinbekomme.
-
std::wstring mystr; DeineWinApiFunc(mystr.c_str());Sollte klappen...
MfG SideWinder
-
std::wstring read_file(const std::string& filename) { std::wifstream in_stream(filename.c_str(), std::ios::in); std::wstring string_content; if (!in_stream) return string_content: while (in_stream.eof() == false) string_content += in_stream.get(); return string_content; } // ... // Window Procedure // WM_PAINT // ... std::wstring filecontent = read_file("Test.cpp"); TextOut(hDC, 10, 10, filecontent.c_str(), filecontent.length()); // ...Wo ist das Problem?
-
Danke hatte das .c_str(), vergessen aber ist es normal das bei TextOut keine Zeilenumbrüche dargestellt werden??
-
Das liegt daran, das du einfach falsch ans Auslesen der Datei ran gegangen bist ... ließ zeilenweise ein ... dann hast du das Problem nicht => std::getline ...