Для начала нужно уяснить, что в 'голом' С (и С++ тоже) строк нет вообще. Есть только массивы символов, причем фиксированной длинны. Поэтому ваш strcat("C:\\", win.cFileName) гарантированно работать не будет вообще. И никакой TCHAR вам не поможет.
Цитата(EttoreMajorana @ 26.5.2017, 17:34 ) | Тут если ты работаешь с файловой системой, то строки у тебя TCHAR, если работаешь с сетью, то строки у тебя WCHAR, строки в старых учебниках и у студентов в лабах - это массивы символов, строки в новых учебниках - это классы, классы, классы... |
Как все запущенно char'ов в С/С++ всего 2 - это char и wchar_t, все остальное это рукоблудие MS и писателей библиотек (даже с учетом того, что библиотеки ныне внесены в стандарт)
Когда стало понятно, что со строками в языке совсем беда, в С++ были сделаны (в библиотеке) классы, которые позволили бы работать с нормальными строками - это std::string (ну и std::wstring). В С такой номер не прошел, так что там до сих пор воюют с ними руками.
TCHAR (с сотоварищами) появился тогда, когда до MS дошло, что в мире существует не только Английский язык, но еще много других. В том числе такие, что никак в char не умещались. Раньше MS это поняли в Unicode Consortium и был разработан char пошире, что бы туда уже все влезло. В компиляторах это появилось сильно позже, в виде типа wchar_t. Windows NT уже использовала для всех внутренних строк именно широкую Unicode кодировку. Но тут стал вопрос - что делать с массой кода на С и С++ который был написан ДО того, и в который никто никакой Unicode не вставлял? И как он будет общаться с системными вызовами, которые теперь хотят Unicode? И что делать тем, кто хочет иметь возможность жить и по старому (с char) и по новому (c Unicode) одновременно?
Вот тут и появился TCHAR и все остальные t*. В зависимости от режима компиляции (он выбирается в свойствах проекта) он становится или char или wchar_t. Все функции WIN32 API так же меняют принимаемые строки параметры в зависимости от типа компиляции - или строки в старых (8ми битных символах) или строки в Unicode. Таким образом, достаточно сменить настройку проекта и старое приложение волшебным образом меняется в новое - Unicode. К сожалению реальность подкачала, и при смене настройки обычно старое приложение превращается в свежий труп, который отказывается даже компилиться А если учесть, что при создании проекта в VS этот самый Unicode режим по умолчанию включен, то возникает масса проблем. И пытаться решить их приведением char* в TCHAR* сродни попытке реанимации трупа.
Цитата(EttoreMajorana @ 26.5.2017, 17:34 ) | Это гипертрофированный ассемблер на стероидах! |
Ну его так и создавали. Хотите чего нибудь более высокоуровнево - берите Java или C#
|