CString in wchar_t*



  • Guten Morgen,

    ich hab folgendes Problem.
    Ich möchte ein CString in ein wchar_t* umwandeln und brauch bitte eure Hilfe.

    Von Hand reinschreiben funktioniert:

    wchar_t *wchDatei;
      wchDatei= L"test";
    

    Ich hab aber bereits eine Variable und versuch es derzeit so:

    CString Pfad = "test";
     wchar_t *pwchFileName;
     pwchFileName = CA2W(Pfad);
    

    Dann steht in pwchFileName "﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾﻾...."

    Vielen Dank schonmal für eure Hilfe. 😃

    Gruß pmb


  • Mod

    CA2W liefert nur einen temporären Zeiger!
    Du kannst CA2W für diesen Moment nutzten, im nächsten Statement wird der Speicher wieder freigegeben.

    Verwende doch einfach CStringW, wenn Du schon die MFC nutzt 😉

    Grundsätzlich: Warum baust Du nicht Dein Programm auf Unicode auf.



  • Hallo,

    ich verstehe nicht ganz wie ich das machen soll.

    Hab jetzt mal folgenden Code, der aber nicht geht, weil ich CStringW nicht in wchar_t* konvertieren kann.

    wchar_t *pwchFileName;
      CStringW str(Pfad);
      pwchFileName = str;
    

    Es ist auch schon ein (fast) fertiges Projekt. Daher müsste ich alles umschreiben.
    Daher kommt Unicode leider nicht in Frage.

    Ich brauch ein wchar_t * Objekt, da ich in einer vorhandenen Unicode .dll von meinem MultiByte Projekt eine Funktion aufrufe, die eine wchar_t * Objekt benötigt.



  • Habs jetzt gelöst bekommen.

    CString Pfad="test";
      CStringA origa(Pfad);
    
      const size_t newsizea = (origa.GetLength() + 1);
      char *nstringa = new char[newsizea];
      strcpy_s(nstringa, newsizea, origa);
    
      size_t convertedCharsa = 0;
      wchar_t *wcstring = new wchar_t[newsizea];
      mbstowcs_s(&convertedCharsa, wcstring, newsizea, origa, _TRUNCATE);
    

    @Martin: Durch dein CStringW Tipp bin ich auf folgenden MSDN Eintrag aufmerksam geworden.

    Siehe MSDN http://msdn.microsoft.com/de-de/library/ms235631.aspx

    Danke.
    Gruß pmb


  • Mod

    Hmmm. Dann hast Du aber nicht verstanden was passiert:

    Das langt doch:

    CString Pfad="test"; 
    CStringW Unicode(Pfad);
    

    Dieser ganze new Quatsch ist unnötig.
    Bist Du sicher dasst Du keinen const wchat_t * benötigst?
    Wenn Du einen beschreibaren Speicher benötigst, dann gibt es immer noch GetBuffer:

    CStringA Pfad="test"; 
    CStringW Unicode(Pfad); 
    wchar_t* wcstring = Unicode.GetBuffer(0);
    


  • Ok haste recht 😃
    Funktioniert genauso und viel schneller.

    Nochmals Danke.



  • Zusatzfrage:
    Wird

    Unicode.ReleaseBuffer();
    

    Nach dem Kopieren benötigt?


  • Mod

    thenoname schrieb:

    Zusatzfrage:
    Wird

    Unicode.ReleaseBuffer();
    

    Nach dem Kopieren benötigt?

    ReleaseBuffer ist nur notwendig, wenn in den Puffer geschrieben UND sich die Länge geändert hat.


Anmelden zum Antworten