[MFC] Cum convertesc intre CString si char*?

Despre MFC, ATL si alte biblioteci C++ de la Microsoft (forum moderat)
Post Reply
User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

[MFC] Cum convertesc intre CString si char*?

Post by Marius Bancila » 05 Aug 2007, 18:46

Intrebare: Am o functie care ia ca argument un char*. Eu folosesc CString si nu pot modifica functia respectiva. Cum pot pasa CString-ul ca parametru?

Raspuns: CString contine intern un buffer de TCHAR (cu alte cuvinte LPSTR). Pentru un build non-UNICODE, aceasta inseamna char*. La un buildpentru UNICODE, aceasta inseamna wchar_t*. Conversia la char* e simpla in primul caz.

Code: Select all

void foo(char* str)
{
  \\ ...
}

void bar()
{
  CString str = "exemplu";
  foo(str.GetBuffer(1 + str.GetLength()));
  str.ReleaseBuffer(); // necesar doar daca foo modifica buffer-ul
}
Trebuie inteles ca aceasta abordare nu functioneaza intr-un build pentru UNICODE, pentru ca in acest caz metoda GetBuffer() returneaza un wchar_t*. Mai mult, intre apelurile GetBuffer() si ReleaseBuffer() nu se poate apela nici o alta metoda a clasei CString pentru obiectul in cauza.

Daca lucrati cu VC++ de la 2002 in sus, puteti folosi macro-ul CT2A (adica const TCHAR* la char*).

Code: Select all

void bar()
{
  CString str = _T("exemplu");
  CT2A tstr(str);
  foo(tstr);
}
Intr-un build non-UNICODE CT2A devine CA2A, iar intr-unul pentru UNICODE CW2A. In ambele cazuri, conversia la char* se face corect. Alternativ, exista CT2CA, adica const TCHAR* la const char*.


<< Back to MFC index


Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

Post Reply