Char* zu LPCWSTR



  • Hallo,
    Ich habe jetzt schon ziemlich lange gegoogelt, aber nix gefunden was mir bei meinem Problem helfen würde.
    Ich brauche eine Funktion die char* in LPCWSTR umwandelt.

    LPCWSTR CharToWideChar(char* text) {
    ...
    }
    

    Was ich nicht machen kann ist:

    1. _T("Text")
    2. In den Einstellungen Unicode abschalten

    Danke schonmal für Antworten!

    p.s.: Hoffe ich habe das im richtigen Forum gepostet da ich VC++ 2008(9.0) verwende.



  • wie wärs mit MultiByteToWideChar ?

    // edit: korrigiert 🙂



  • Wie würde das dann funktionieren?
    Ich finde keine Dokumentation zu dem Befehl 😞



  • Xantus hat sich leicht vertan, die Funktion heißt MultiByteToWideChar.



  • LPCWSTR CharToWideChar(char* txt) {
    	int len=strlen(txt)+1;
    	LPCWSTR buffer[len];
    	MultiByteToWideChar(CP_ACP,NULL,txt,-1,buffer,len)
    	return &buffer;
    }
    

    Das will iwie nicht! Was mache ich falsch?


  • Mod

    CA2W ist eine fertige Funktion in tchar.h



  • error C3861: "CA2W": Bezeichner wurde nicht gefunden.

    Ja, ich habe die tchar.h eingebunden!



  • static_cast<LPCWSTR>(txt) mal probiert?
    habe kein windows, kansn daher net testen, aebr n kumpel von mir meinte, das klappt.

    static_cast<wchar_t*>(txt) wäre evtl ne andre variante, die evtl das bewirken könnte, was du suchst - probeirs mal aus.

    greets

    Branleb



  • Verzweifelter Anfänger schrieb:

    Das will iwie nicht! Was mache ich falsch?

    schau dir mal deine argumente und die argumente, die auf http://msdn2.microsoft.com/en-us/library/ms776413(VS.85).aspx beschrieben sind, an.



  • Martin Richter schrieb:

    CA2W ist eine fertige Funktion in tchar.h

    Hö? Ist das nicht aus der ATL?



  • MFC/ATL... aber wir sind ja hier in dem passenden Forum, oder?



  • Ich hätte auch nicht gefragt wenn Martin nicht tchar.h geschrieben hätte.



  • Ach so... ja klar... hat natürlich nichts tchar.h zu tun.

    DIese "Makros" sind in "atlconv.h" deklariert und verwenden jetzt templates...



  • @branleb: Nein es funktioniert nicht
    @Xantus: Das hab ich jetzt nochmal gemacht bin aber nicht auf meinen Fehler gestoßen.
    Mein Momentaner Stand:

    LPWSTR buffer=(LPWSTR)malloc(strlen(text)+1);
    MultiByteToWideChar(CP_ACP,0,text,sizeof(text),buffer,sizeof(buffer));
    

    Aber da kommen irgendwelche chinesisch aussehenden Zeichen raus! 😮
    Bitte helft mir



  • Verzweifelter Anfänger schrieb:

    @Xantus: Das hab ich jetzt nochmal gemacht bin aber nicht auf meinen Fehler gestoßen.

    also wenn du die ATL verwendest, nimm die von Martin Richter beschriebene template-Klasse.

    zu deinem code

    Verzweifelter Anfänger schrieb:

    Mein Momentaner Stand:

    LPWSTR buffer=(LPWSTR)malloc(strlen(text)+1);
    MultiByteToWideChar(CP_ACP,0,text,sizeof(text),buffer,sizeof(buffer));
    

    Aber da kommen irgendwelche chinesisch aussehenden Zeichen raus! 😮
    Bitte helft mir

    - der buffer isn bisschen klein, oder? du weißt schon, dass sizeof(wchar_t) gewöhnlich 2 bytes groß ist?
    - verwende doch mal CP_UTF8 und setzte dwFlags auf 0;
    - schau dir mal an, was der letzte parameter (größe) des buffers haben will.
    keine größe in bytes mit sizeof(buffer), sondern die größe des strings in WCHAR-werten
    - lies nochmal die "Return Values"-Sektion und versuche, damit auf den Fehler zu stoßen. Rückgabewerte vergleichen, GetLastError() und so 😉
    - übrigens

    MSDN schrieb:

    MultiByteToWideChar does not null-terminate an output string if the input string length is explicitly specified without a terminating null character. To null-terminate an output string for this function, the application should pass in -1 or explicitly count the null terminator for the input string.



  • LPWSTR buffer;
    buffer=(LPWSTR)malloc(MultiByteToWideChar(CP_UTF8,0,titel,-1,buffer,0));
    MultiByteToWideChar(CP_UTF8,0,titel,-1,buffer,sizeof(buffer)/sizeof(buffer[0]));
    

    Funktioniert aber leider immer noch nicht! GetLastError() meckert nicht!


  • Mod

    hmmmmmmmmm schrieb:

    Martin Richter schrieb:

    CA2W ist eine fertige Funktion in tchar.h

    Hö? Ist das nicht aus der ATL?

    Sorry! Ist natürlich ATL...



  • #include <atlbase.h>

    und dann in deine Funktion:

    USES_CONVERSION;
    A2W(charvar,widevar);



  • Die Makroc *ohne* ein "C" ganz vorne sollte man eigentlich nicht mehr verwenden! Sie haben massive Probleme, wenn diese in einer Schleife verwendet werden... Auch ist immer das "unschöne" USES_CONVERSION notwendig...
    Die neuen Makros verwenden Templates, da ist es viel schöner

    =>

    CA2*
    


  • @DaRpH: Danke für den Tipp! Leider findet der Compiler die atlbase.h nicht. Woran kann das legen?


Log in to reply