Wie bekommt man einen WCHAR* aus einem std::string?
-
Ich habe im Forum allerlei Einträge zu verwandten Fragen gefunden und jetzt bereits zwei Stunden mit Versuchen verbracht, irgendwas funktionierendes hinzubekommen. Aber bis jetzt hat nichts funktioniert.
Also, ich möchte folgende Funktion benutzen:BOOL WINAPI CreateProcessWithLogonW(CONST WCHAR* lpUsername, CONST WCHAR* lpDomain, CONST WCHAR* lpPassword, ...);Allerdings soll Sie in eine Funktion folgender Form eingebaut werden:
void programm_starten_als(const std::string& Benutzername, const std::string& Domain, const std::string& Passwort,...);Ich muss also irgendwie eine möglichst saubere Konvertierung von std::string zu einem WCHAR*-String hinbekommen. Wie könnte man das bewerkstelligen? Was problemlos geht, ist direkt einen WCHAR-Array in die Funktion einzusetzen:
CreateProcessWithLogonW(L"Benutzer",...);Aber das ist noch keine Lösung, ich kann ja nicht alles in den Quellcode reinschreiben

Vielleicht hilft folgender Typedef aus der winnt.h:
typedef wchar_t WCHAR; typedef WCHAR *PWCHAR,*LPWCH,*PWCH,*NWPSTR,*LPWSTR,*PWSTR;Vielen Dank schonmal

-
Mit der CRT Funktion wcstombs zum Beispiel.
http://msdn2.microsoft.com/en-us/library/5d7tc9zw(VS.80).aspxOder noch einfacher mit den entsprechenden ATL T-Makros.
CW2A oder W2A
-
deine Funktion ist für Unicode. Wenn du deine Projektoptionen auf Unicode umstellst, sollte alles ganz normal mit c_str klappen.
Versuch das mal, andere strings musst du dann aber auch als unicode eingeben, am besten du machst um alle strings mal ein _T("deinstring"), damit wird je nachdme ob unicode oder nicht der text gehandhabt.So, wenn das nicht geht, gibt es noch die Funktion MultibyteToWideChar aber die ist echt mistig zu bedienen.
Und dann gibt es noch google:
http://publib.boulder.ibm.com/infocenter/iadthelp/v7r0/index.jsp?topic=/com.ibm.etools.iseries.langref.doc/rzan5mst336.htm
-
Maxi schrieb:
deine Funktion ist für Unicode. Wenn du deine Projektoptionen auf Unicode umstellst, sollte alles ganz normal mit c_str klappen.
Nee... da sich std::string unbeeindruckt der Compiler-Defines zeigt...
Entweder er ändert std::string nach std:.wstring ab oder er verwendet die von Martin vorgeschlagenen Makros (oder er macht das was die Makros machen von "Hand" mittels MultiByteToWideChar")
-
Hm,
also wcstombs geht wohl nicht, das scheint eine Konvertierung in die falsche Richtung zu sein:"Converts a sequence of wide characters to a corresponding sequence of multibyte characters"
MultiByteToWideChar scheint das Beste zu sein, ich schreibe mir dann eine Hilfsfunktion damit. Ich habe zum Testen einmal Folgendes geschrieben und
es klappt!string username = "Benutzername"; const size_t username_size = username.size()+1; const char* cUsername = username.c_str(); WCHAR wUsername[256]; MultiByteToWideChar(CP_OEMCP // UINT CodePage ,MB_PRECOMPOSED // DWORD dwFlags ,cUsername // LPCSTR lpMultiByteStr ,username_size // int cbMultiByte ,wUsername // LPWSTR lpWideCharStr ,256); // int cchWideCharAlso vielen Dank!

P.S.
Sieht hier zufällig einer noch einen fatalen Fehler...?
-
Ja, du solltest die Größe des Zielbereichs schon deinen Erwartungen anpassen (du erwartest 'username_size' Zeichen).
PS: Wenn du nicht wirklich auf std::string festgelegt bist, nimm lieber seinen Bruder std::wstring.