*gelöst* Unicode: CString zu const char* casten



  • Hallo
    Mein derzeitiges Problem baut auf dem Problem aus diesem Thread auf:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-185850.html

    Dort konnte ich das Problem in den Griff bekommen, leider tat sich aber dadurch ein neues Problem auf. Seit dem ich mit /D "UNICODE" die CFileDialog-Funktion compiliere tritt dieses Problem auf.

    Aus der CFileDialog Funktion gebe ich den Pfad einer Datei als CString zurück
    und bearbeite ihn in meiner "Controller-Funktion" so das der Pfad als const char* an eine "TinyXML" Funktion übergeben wird. "TinyXML" erwartet auch einen const char* .

    Der Code in meiner "Controller-Funktion" sieht so aus.

    CString s_pathName;
    const char* pathName;
    
    s_pathName = OpenEdlDialog();
    pathName = (const char*)LPCTSTR(s_pathName);  // hat bisher funktioniert
    ReadEdlFile(pathName);
    

    beim Code in der Dialog Funktion , "returne" ich den CString den die Standard Funktion CFileDialog::GetPathName() liefert.

    Wenn ich mir jetzt den Wert für "pathName" ausgeben lasse, erhalte ich nur ein "V".

    Es gab zwar schon einige Beiträge zu CString und const char*, aber keiner funktioniert. Wäre sehr dankbar wenn mir jemand auf die Sprünge helfen könnte.
    Vielen Dank im Voraus.



  • Im UNICODE-modus verwaltet der CString keine char's mehr, sondern wchar_t's. Die kannst du nicht durch einen einfachen Cast ineinander umwandeln. Schau doch mal in der MSDN zum Thema "String Conversion Macros" (besonders T2A() könnte hier helfen).



  • nur nochmal zum verständnis, ich muss den CString in ein wchar_t umwandeln und dann von einem wchar_t in einen char* bzw. const char*?



  • Dein Probelm ist, dass ein Unicode String "VER" so aussieht: 'V',0,'E',0,'R',0,0, da Unikode Zeichen 2 Byte belegen und das Ende mit 2 Nullen markiert ist.

    Wenn du dies nun in ain Array von char castest ist der String natürlich bei der ersten null zuende.

    Einfach die Nullen von Hand in ner for Schleife rauslöschen.

    MfG



  • Nein, das Umwandeln in ein wchar_t-Array kann der CString schon alleine - du mußt nur dieses Array transformieren in ein char-Array.


  • Mod

    Für die entsprechenden Konvertierungen gibt es einen Satz ATL Makros:

    USES_CONVERSION;
    CString s_pathName;
    const char* pathName;
    s_pathName = OpenEdlDialog();
    pathName = T2A(s_pathName);  
    ReadEdlFile(pathName);
    

    Oder die neuen Makros (dann aber bitte inline):

    CString s_pathName;
    const char* pathName;
    s_pathName = OpenEdlDialog();
    ReadEdlFile(CT2A(pathName));
    


  • Vielen Dank. Hat sowohl mit der for-Schleife, als auch mit den Makros funktioniert.


Anmelden zum Antworten