CString in std::string umwandeln geht nicht



  • Hallo zusammen,

    nach etlichem Googeln und stundenlangem probieren, gebe ich bald auf. Ich schaffe es einfach nicht, einen CString einen std::string umzuwandeln. Ich habe hauptsächlich nur normale std::string Variablen. Der einzige Grund warum ich ein paar CString-Variablen habe ist, weil es Dialogvariablen sind für MFC. Es ist übrigens das abgespeckte Windows CE 5.0 MFC. Das kann so gut wie gar nichts finde ich. Jedenfalls habe ich folgendes versucht:

    std::string test = (LPCTSTR)m_cstringVariable;

    Ich erhalte folgenden Error:

    cannot convert from 'const unsigned short *' to 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char
    > >'
    No constructor could take the source type, or constructor overload resolution was ambiguous

    Was könnte ich noch versuchen? Könnte es irgendwie mit GetBuffer() gehen?

    Eigentlich will ich nur zwei Strings vergleichen. Leider sind sie unterschiedlichen Typs.

    Grüße
    Fresh



  • Er. Ich hab folgende Antwort geschrieben bevor mir aufgefallen ist dass du von "Windows CE 5.0" schreibst. Aber egal, wenn ichs schonmal geschrieben habe...
    (Weiter unten mehr zum Them Windows CE 5.0)

    ----

    Wie aus der Fehlermeldung hervorgeht, sind deine CString s UTF-16 ( wchar_t bzw. unsigned short ). Und std::string ist dummerweise nicht UTF-16.

    Die einfachste Variante zwei solche String zu vergleichen ist den std::string in einen CString zu konvertieren. Das geht nämlich netterweise trotz dem der CString UTF-16 ist, der "narrow" String wird dabei automatisch mit der System-Codepage nach UTF-16 konvertiert.

    Wenn du das an mehreren Stellen brauchst, kannst du auch gleich passende operator == definieren:

    inline bool operator == (std::string const& a, CString const& b)
    {
        return CString(a.c_str(), a.size()) == b;
    }
    
    inline bool operator == (CString const& a, std::string const& b)
    {
        return b == a;
    }
    

    ----

    So, nu zum Thema "Windows CE 5.0".

    Der Compiler für Windows CE 5.0 ist eMbedded Visual C++ 4.0.
    Und wenn die Wikipedia-Seite zur MFC Recht hat, dann ist beim eMbedded Visual C++ 4.0 die MFC Version 6.0 dabei, also die selbe Version wie die von Visual Studio 6.0.

    In der gibt es den Konstruktor noch nicht den ich oben verwendet habe ( char* + Länge). Es gibt aber einen Konstruktor der nur einen char* nimmt (d.h. einfach die Länge, also das a.size() weglassen). Das funktioniert dann natürlich nicht mehr korrekt mit Strings die "eingebettete" Null-Characters haben. Da solche Strings aber ziemlich unüblich sind wirst du vielleicht damit leben können.

    Die Alternative wäre den String "zu Fuss" nach UTF-16 zu konvertieren. Unter Win32 nimmt man dafür MultiByteToWideChar() . Ob das unter Windows CE 5.0 auch verfügbar ist weiss ich allerdings nicht.


Anmelden zum Antworten