wstring zu LPWSTR?
-
hi leute,
das ist zwar eine fragestellung, die sich relativ häufig findet, aber ich kriegs trotzdem nicht hin: wie konvertiere ich richtig von std::wstring zu LPWSTR?
ich schaffs zwar ohne compilerfehler, aber dafür steht im LPWSTR dann nur blödsinn (irgendwelche sonderzeichen) drin - probiert hab ichs zB so: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/2651454d-a766-4a08-bc36-c47334c7c693.
gibts da keine "standard"-methode?
mfg & danke
zoidberg
-
std::wstring::c_str()
-
jo genau, so hätt ichs auch gemacht. wenn ich aber einen LPWSTR-(bzw. wchar_t-)wert gleich wstring1.c_str() setzen will, bekomm ich folgende fehlermeldung:
cannot convert from 'const wchar_t *' to 'LPWSTR'
also hab ichs mal mit einem const_cast davor probiert:
LPWSTR wt = const_cast<LPWSTR>(wstring1.c_str());
das wird ohne fehler genommen. in der variable steht dann aber sowas hier:
ﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮ"ߧHş>statt einem sinnvollen text wie in wstring1. wie sollte man das sonst machen?
-
Du darfst in den Speicherbereich, den du von .c_str() bekommst, nicht schreiben. Deshalb ist der Rückgabewert auch const. Wenn du das const wegcastest und trotzdem reinschreibst, ist das Ergebnis undefiniert.
Wie wärs mit
std::vector<wchar_t> wbuf;
mit einer passenden Größe, dann gehtLPWSTR strptr = &wbuf[0]
.
-
const
wegcasten ist im Allgemeinen gefährlich. Hier besteht aber ein grösseres Problem darin, dass der Zeiger auf den internen Puffer desstd::wstring
s ziemlich schnell ungültig werden kann. Ich würde mit einer Kopie vorsorgen.std::vector
nimmt dir die Speicherverwaltung ab, du kannst damit bedenkenlos wie mit C-Arrays arbeiten, solange du nurconst
-Operationen durchführst (denn Methoden wiepush_back()
können Zeiger auf Elemente invalidieren).// Originaler Wide-String std::wstring string = L"hallo"; // Kopiere in std::vector inklusive Nullterminierung std::vector<wchar_t> vec(string.begin(), string.end()); vec.push_back(L'\0'); // Extrahiere wchar_t* LPWSTR c_string = &vec[0];
-
leitln, ihr seits super. funktioniert.
dass das mit const wegcasten nicht gerade sauber is, is mir eh klar. war auch mehr ein verzweiflungsversuch. btw wusste ich gar nicht, dass man einen string so in einen vector kopieren kann.
danke auf jeden fall euch dreien, die frage wäre damit geklärt.
-
zoidberg schrieb:
btw wusste ich gar nicht, dass man einen string so in einen vector kopieren kann.
Das ist eine Iterator-Range. Im Prinzip wird jeder Iterator im halboffenen Intervall [
string.begin()
,string.end()
[ passiert, wobei das entsprechende Element vomstd::wstring
gelesen und in denstd::vector
eingefügt wird.Du kannst das als Alternative zu einer manuellen Schleife ansehen, intern passiert jedoch das Gleiche. Man hätte z.B. auch nach dem Konstruieren
std::vector::insert()
oderstd::copy()
nehmen können, aber der Konstruktor ist wohl am naheliegendsten.
-
soweit ich weiß kannst du auch einfach wstring string(L"hallo"); und dann string.data() schreiben. Die Konvertierung in vector is halt sehr ineffizient und unnötig. Besser ist dann Features von altconv.h und altbase.h (#include <altconv.h>) zu benutzen z.B. string normalString("hallo"); CA2T someLPWSTR(normalString.c_str());
-
Ob dieser Hinweis nach 12 Jahren wohl noch ankommt? Zumal das, was du vorschlägst, die allererste Antwort war, die aber halt nicht den Bedürfnissen gerecht wurde.