CString in string und zutück



  • Hi,
    hab das hier schon gefunden

    string a( "test1" );
    	CString b( "test2"  );
    
    	//CString -> std::string
    	a = LPCTSTR( b ); 
    
    	//std::string -> CString
    	b = a.c_str();
    

    aber das Funktioniert nicht. Wisst ihr wieso?



  • ?

    CString string_mfc("testen!!!");
    std::string string_standard(string_mfc.GetBuffer());
    

    ... für nen std::string ...

    LPCTSTR lpszString = string_mfc.GetBuffer();
    

    an sonnsten ...


  • Mod

    @(D)Evil:
    Warum verwendest Du bei diesem Code überhaupt GetBuffer?
    Es geht dich auch ohne:

    CString mfcStr("Test");
    	std::string stlStr(mfcStr);
    

    Weiterhin gibt es in CString in ATL/FC mittlerweile ja auch GetString was dirket einen const TCHAR* returniert.
    Diese Funktion würde ich in diesen Anwendungsfällen statt GetBuffer bevorzugen.

    GetBuffer ist im Extremfall sogar langsamer, da ein Writable Pointer angefordert wird und CString ja intern eine Referenzzählung nutzt die hier nicht mehr funktionieren kann!



  • @cameron: Was genau heißt "funktioniert nicht"? Eigentlich sollte dein Code so funktionieren.

    (ein Punkt ist noch zu beachten - in UNICODE-Umgebungen arbeitet CString auf wchar_t - da mußt du als STL-Äquivalent wstring verwenden)



  • @CStoll: Ich schreibe unter VS8 und vermute mal das es sich hier um eine Unicodeumgebung handelt. Was muss ich da wie ändern denn er sagt immer was von "Konvertierung des Parameters 1 von 'CString' in ... nicht möglich".
    Habe mal meine C++ Bücher überflogen da steht nur drin das wchar halt widechar ist und 16bit also 2 Byte groß ist und damit doppelt so groß wie ein normaler Char.
    Was ist bei der Konvertierung anders? Sind die für mich interessanten Infos nur in einem Byte? Kann ich irgendwie das andere "abschneiden" und einen normalen String daraus machen und nachher wieder diesen "normalen" String in einen CString zurück wandeln?
    MfG Christian


  • Mod

    Komisch CString kann in der Unicode Variante sowohl MBCS als auch Unicode Stringzuweisungen annehmen. Wie sieht exakt der Code aus? Und welche Zeile erhält welche Fehlermeldung?



  • Der Code sieht zur Zeit so aus:

    string a("test1"), string_standard("test1");
    	CString b( "test2"  ), string_mfc("testen!!!"), mfcStr1("Test");
    
    	//CString -> std::string
    	//a = LPCTSTR( b );
    	//a = b.GetBuffer();
    	LPCTSTR lpszString = string_mfc.GetBuffer();
    
    	CString mfcStr("Test");
        //std::string test stlStr(mfcStr);
    
    	//std::string -> CString
    	//b = a.c_str();
    
    	//CString strPlate; 
    	//strPlate.Format(_T("%s"), string1.c_str());
    

  • Mod

    ... und in welcher Zeile gibt es welchen Fehler?



  • ich habe nach und nach alle Zeilen ausdokumentiert solange bis keine Fehler mehr gekommen sind.



  • // CString => LPCTSTR
    CString string_mfc("testen!!!");
    LPCTSTR lpszString = string_mfc;
    
    // CString => std::string bzw std::wstring
    CString string_mfc("testen!!!");
    #ifdef _UNICODE
        std::wstring string(string_mfc);
    #else
        std::string string(string_mfc);
    #endif
    

    😉

    // std::string => CString
    std::string string_stl("testen!!!");
    CString string_mfc(string_stl.c_str());
    

    sollte so eigentlich alles gehen ... kann man aber sicher noch eleganter lösen ...



  • Die einfachste Lösung:

    Project->Properties->Configuration Properties->Character Set->Not Set

    und alle Unicode-Konvertierungsprobleme sind gelöst : )



  • Danke!
    das wars soo jetzt klappt das auch wieder alles .... DANKE euch allen!!!


Anmelden zum Antworten