[so] [Tema1] LPWSTR vs char*

Sergiu Costea sergiu.costea at gmail.com
Sun Mar 17 21:55:00 EET 2013


2013/3/17 Andrei Petre <p31andrei at gmail.com>:
> Salut,
>
> Eu am niste probleme cand folosesc typedef-urile din windows, ca
> LPWSTR. Mai exact, codul urmator produce o eroare, dupa ce sunt facute
> niste strcat-uri (e scheletul de la voi, nu e modificat).
>

Salutare,

Văd că mai sus faci referire la LPWSTR, care este unicode, și mai jos
folosești LPTSTR, care poate fi sau unicode, sau 8-bit char. Verifică
faptul că peste tot este LPTSTR în cod.

Tipul LPTSTR este definit ca [1]:

#ifdef UNICODE
    typedef wchar_t TCHAR;
#else
    typedef unsigned char TCHAR;
#endif
typedef TCHAR *LPTSTR, *LPTCH;


Dacă folosești scheletul din temă, acesta include la început un
"#undef UNICODE" care setează LPTSTR ca pointer către 8-bit chars,
deci nu ar trebui să fie diferențe între char * și LPTSTR.


> LPTSTR argv = NULL;
> argv = get_argv(s); // comanda este > k=a (variabila de mediu)
>
> free(argv); //produce eroare
>
> eroarea este "CRT detected that the application wrote to memory after
> end of heap buffer". Am cautat pe net, si e din cauza ca n-are \0
> chestia la care dau free. Deci e o problema cu faptul ca acel typedef
> de windows wchar_t* echivalent cu LPTSTR e pe 2 octeti.
>
> Daca schimb in schelet LPTSTR cu char* totul e ok. Cred ca e din cauza
> ca se fac alocari fara si realloc sa se foloseasca sizeof() in
> schelet, dar am incercat sa-l repar rapid si n-am reusit. N-as mai
> pierde timpul cu asta, si as schimba direct sa folosesc char* in loc
> de LPTSTR, este OK cu voi?

Este ok oricum, însă nu ar trebui să fie diferențe LPTSTR și char *.
Problema este probabil altundeva. Încearcă să muți "#undef UNICODE"
înainte de "#include <windows.h>" sau să-l definești la compilare și
vezi dacă merge.

[1] http://msdn.microsoft.com/en-us/library/windows/desktop/dd374131%28v=vs.85%29.aspx

Numai bine,
Sergiu


More information about the so mailing list