Funktion erwartet LPCWSTR <-> string konvertieren?



  • Hallo!
    Ich habe bisher immer char verwendet und versuch mich jetzt mit string vertraut zu machen.
    Hab eine simple Hello world Anwendung (WinAPI) geschrieben und die Direct3D Funktion zur Ausgabe erwartet einen LPCWSTR...
    Ich habe bisher Texte mit Text("Hallo") angegeben
    Allerdings funktioniert das nur bei direktem Text und nicht bei Variablen

    Mein erster Versuch war

    DrawText(TEXT(s.c_str()),...)
    

    Allerdings bekomme ich dann

    1>c:\d\eigeneprogs\tanktics\tanktics\main.cpp(147) : error C2065: 'Ls': nichtdeklarierter Bezeichner
    1>c:\d\eigeneprogs\tanktics\tanktics\main.cpp(147) : error C2228: Links von ".c_str" muss sich eine Klasse/Struktur/Union befinden.
    

    Bevor ich Visual Studio Express verwendet habe, hat die Funktion immer einen LPCSTR erwartet und alles hat mit char tadellos funktioniert...
    Jetzt bekomme ich aber wenn ich das TEXT weglasse und einfach ein (LPCWSTR)vor den String setze entweder eine Fehlermeldung beim Kompilieren oder es funktioniert, zeigt mir jedoch nur chinesische Zeichen als Ausgabe an!

    Hoffe ihr könnt mir da helfen!
    MfG LPCWSTR?



  • Ich empfehle Dir nicht std::string sondern std::basic_string<TCHAR> (oder ein typedef/define) zu verwenden. Dann umgehst Du die ganzen Probleme...

    Neben der "korrekten" gibt es noch zwei weitere Lösungen:
    1. Du stellest Dein projekt auf ANSI/MBCS um (aktuell hast Du Unicode)
    2. Du fängst tatsächlich mit Konvertieren an (z.B. via mbstowcs)



  • Versuche gerade das hinzubekommen aber ich bekomme unzählige konvertierungsfehler...

    Hast du vlt ein Codebsp für typedef mit basic_string<TCHAR> bzw.
    dem verwenden des Typs bei einer Ausgabe oder dgl?
    Wär super!



  • Zum Beispiel:

    #include <windows.h>
    #include <string>
    typedef std::basic_string<TCHAR> TString;
    


  • Ups...Du wolltest noch ein Beispiel:

    TString strDemo(TEXT("BlaBlaBla"));
    MessageBox(NULL, strDemo.c_str(), NULL, MB_OK);
    


  • Ok bis dahin hatte ich es auch schon geschafft allerdings weiß ich nicht wie ich bei diesem Datentyp ähnlich wie mit sprintf() Text bzw Variablen einfügen kann...

    TString ts;
    sprintf(ts,"Mein Wert: %d",wert);
    


  • Weil ich dann das bekomme

    error C2664: 'sprintf': Konvertierung des Parameters 1 von 'TString' in 'char *' nicht möglich
    


  • Du kannst stattdessen wsprintf() nehmen, weicht allerdings teilweise von sprintf() ab. Kann glaube ich keine floats formattieren oder so...



  • wenn ich wsprintf verwende funktionierts leider weder mit dem typedef TString noch mit LPWSTR oder LPCWSTR....



  • wozu soll dieser LPCWSTR eigentlich gut sein wenn man damit nur direkten Text verwenden kann!?!

    gibts denn da keine einfache Möglichkeit?
    sowas wie:

    #include <windows.h>
    #include <string>
    typedef std::basic_string<TCHAR> TString;
    
    void func(){
    int wert=10;
    TString ts;
    ts="Mein Wert: "+wert;
    
    dv->DrawText(ts,...);
    }
    


  • oh, ich hab mich bei TString verlesen 😉
    müsste nen TString nich sowas wie .c_str() oder so haben?



  • LPCWSTR? schrieb:

    wozu soll dieser LPCWSTR eigentlich gut sein wenn man damit nur direkten Text verwenden kann!?!

    Um dem Programmierer das Leben schwer zu machen 😉
    Ich wette solche Dinge sind auch mit dafür verantwortlich das MS das .NET-Framework ins Leben gerufen hat 😉



  • müsste nen TString nich sowas wie .c_str() oder so haben?

    ja aber ich bekomms nicht hin dass wsprintf es annimmt....



  • geeky schrieb:

    oh, ich hab mich bei TString verlesen 😉
    müsste nen TString nich sowas wie .c_str() oder so haben?

    Jupp gibts ja auch 😉 .

    LPCWSTR? schrieb:

    müsste nen TString nich sowas wie .c_str() oder so haben?

    ja aber ich bekomms nicht hin dass wsprintf es annimmt....

    Nop wsprintf geht da auch nicht, da c_str() einen konstanten Zeiger auf den Inhalt zurückgibt und der wird auch nicht verändert *g*.

    Aaaaalso:
    Wenn Du Zahlen etc einfügen willst, brauchst Du std::stringstreams. Diese musst Du dann auch via typedef so kompatible machen wie ichs Dir schon bei basic_string gepostet habe 😋 . Da kannste dann sowas schreiben:

    TStringstream ssCvt;
    ssCvt << TEXT("Das ist die Zahl fünf (") << 5 << TEXT(").");
    MessageBox(NULL, ssCvt.str().c_str(), NULL, MB_OK);
    

    Hinweis: Die Methode str() gibt den Inhalt des Streams als TString zurück, c_str() macht daraus dann einen C-String.



  • Diese musst Du dann auch via typedef so kompatible machen wie ichs Dir schon bei basic_string gepostet habe

    hm...der versuch:

    typedef std::basic_string<TCHAR> TString;
    typedef std::stringstream<TString> TStringstream;

    hat ned geklappt...
    irgendwie nervt das mit dem LPCWSTR ziemlich..deshalb weiß ich auch nicht ob meine Spriteklasse funktioniert oder nicht...
    hm...
    also wenn das schon solche probleme macht werd ich mir üebrlegen ob ich ned doch schon auf c# umsteige



  • Nop, das kann ja auch nicht klappen:

    typedef basic_stringstream<TCHAR>, char_traits<TCHAR>, allocator<TCHAR>> TStringstream;
    


  • Hab jetzt das verwendet

    typedef std::basic_string<TCHAR> TString;
    typedef std::basic_stringstream<TCHAR>, char_traits<TCHAR>, allocator<TCHAR>> TStringstream;
    

    und bekomme:

    1>c:\d\eigeneprogs\tanktics\tanktics\global.h(9) : warning C4091: 'typedef ': Ignoriert auf der linken Seite von 'std::basic_stringstream<_Elem,_Traits,_Alloc>', wenn keine Variable deklariert wurde
    1> with
    1> [
    1> _Elem=wchar_t,
    1> _Traits=std::char_traits<wchar_t>,
    1> _Alloc=std::allocator<wchar_t>
    1> ]
    1>c:\d\eigeneprogs\tanktics\tanktics\global.h(9) : error C2143: Syntaxfehler: Es fehlt ';' vor ','
    1>c:\d\eigeneprogs\tanktics\tanktics\global.h(9) : error C2059: Syntaxfehler: ','



  • Ach, son Mist, vertippt; so:

    typedef basic_stringstream<TCHAR, char_traits<TCHAR>, allocator<TCHAR>> TStringstream;
    


  • ah ok...
    damit hab ich dann:

    typedef std::basic_string<TCHAR> TString;
    typedef basic_stringstream<TCHAR, char_traits<TCHAR>, allocator<TCHAR>> TStringstream;
    

    und

    TStringstream ssCvt; 
    ssCvt << TEXT("Das ist die Zahl fünf (") << 5 << TEXT(")."); 
    MessageBox(NULL, ssCvt.str().c_str(), NULL, MB_OK);
    

    bekomme aber:

    1>c:\d\eigeneprogs\tanktics\tanktics\main.cpp(131) : error C2079: 'ssCvt' verwendet undefiniertes class 'std::basic_stringstream<_Elem,_Traits,_Alloc>'
    1>        with
    1>        [
    1>            _Elem=wchar_t,
    1>            _Traits=std::char_traits<wchar_t>,
    1>            _Alloc=std::allocator<wchar_t>
    1>        ]
    1>c:\d\eigeneprogs\tanktics\tanktics\main.cpp(132) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const wchar_t [24]' ist
    1>c:\d\eigeneprogs\tanktics\tanktics\main.cpp(132) : error C2297: '<<': Ungültig, da der rechte Operand vom Typ 'const wchar_t [3]' ist
    1>c:\d\eigeneprogs\tanktics\tanktics\main.cpp(132) : warning C4552: '<<': Operator hat keine Auswirkungen; Operator mit Nebeneffekt erwartet
    1>c:\d\eigeneprogs\tanktics\tanktics\main.cpp(133) : error C2228: Links von ".str" muss sich eine Klasse/Struktur/Union befinden.
    1>        Typ ist 'int'
    1>c:\d\eigeneprogs\tanktics\tanktics\main.cpp(133) : error C2228: Links von ".c_str" muss sich eine Klasse/Struktur/Union befinden.
    


  • 😃 , Okay, habs jetzt auch mal selbst getestet, das geht (vorher alles außem Kopf^^):

    #include <string>
    #include <sstream>
    #include <windows.h>
    typedef std::basic_string<TCHAR> TString;
    typedef std::basic_stringstream<TCHAR> TStringstream;
    

Anmelden zum Antworten