Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как конвертировать TCHAR в string 
:(
    Опции темы
php5
Дата 16.8.2013, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Нужно  определить путь к Temp  директории,  для этого  юзаю функцию
Код

TCHAR buf [MAX_PATH];
GetTempPath(MAX_PATH, buf);

Теперь   мне нужно полученный путь передать в переменную типа string
PM MAIL   Вверх
Alexeis
Дата 16.8.2013, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



  В общем случае это не получиться. Я одно время делал так
Код

    typedef std::basic_string<TCHAR, std::char_traits<TCHAR>, std::allocator<TCHAR> > tstring;

tstring str(buf);



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
php5
Дата 16.8.2013, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



а как из tstring в string ?   smile 
PM MAIL   Вверх
kuzulis
Дата 16.8.2013, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



Цитата

а как из tstring в string ?  


Можешь просто использовать GetTempPathA, тогда в string без проблем. 
PM MAIL   Вверх
EgoBrain
Дата 19.8.2013, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

Репутация: нет
Всего: 2



Цитата(php5 @  16.8.2013,  16:38 Найти цитируемый пост)
Теперь   мне нужно полученный путь передать в переменную типа string 

Это можно сделать используя выходной строковый поток ostringstream:
Код

TCHAR buf[MAX_PATH];
GetTempPath(MAX_PATH, buf);
    
string str;
ostringstream ostr;
ostr<<buf;
    
str = ostr.str();

Только прежде чем использовать дождись комментариев экспертов, а то они еще могут тухлыми помидорами закидать  smile 
PM MAIL ICQ Skype   Вверх
akizelokro
Дата 19.8.2013, 04:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



wcstombs (хоть статью уже пиши)

а GetTempDirA тоже должно сработать.



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
akizelokro
Дата 19.8.2013, 04:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Притом, сама постановка вопроса некорректна. В зависимости от директив препроцессова tstring уже либо string (без Юникода), либо wstring (c  Юникодом).

так что код должен звучать так 

Код

#ifdef _UNICODE
// если юникод и TCHAR является WCHAR'ом
wbstombs(...)
#else
// ничего не делаем, TCHAR - уже CHAR, так что курим бамбук
#endif




--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Alexeis
Дата 19.8.2013, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(akizelokro @  19.8.2013,  05:10 Найти цитируемый пост)
wcstombs (хоть статью уже пиши)


Цитата(http://www.cplusplus.com/reference/cstdlib/wcstombs/)

The behavior of this function depends on the LC_CTYPE category of the selected C locale.


Остается еще выяснить в какой локали нужно преобразовывать и совсем все будет хорошо. В общем случае, если преобразовывать юникод к анси, такая кака может получиться. Поэтому, или везде TCHAR или везде wchar_t/char . Всякие переходы чреваты кракозяблами. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
akizelokro
Дата 19.8.2013, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

The behavior of this function depends on the LC_CTYPE category of the selected C locale.


Пусть делает в текущей локали (даже пусть не указывает). Когда он решит писать на экспорт, тогда и будет заморачиваться. Сейчас же я не думаю, что ему интересно, как китайцы или арабы увидят надписи в его программе

Добавлено через 4 минуты и 3 секунды
Цитата

Поэтому, или везде TCHAR или везде wchar_t/char . Всякие переходы чреваты кракозяблами.  


К тому же, от таких переходов никуда не деться. кой-где в майкрософте понасованы такие подводные камни, что проект в Юникоде, а вот в функцию надо передавать параметры в мультибайте. Или наоборот. Вот сейчас как рза такую задачку делаю.


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
php5
Дата 19.8.2013, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Всем  спасибо за коменты, пока что остановлюсь на GetTempPathA  smile 
PM MAIL   Вверх
Alexeis
Дата 19.8.2013, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(akizelokro @  19.8.2013,  09:48 Найти цитируемый пост)
кой-где в майкрософте понасованы такие подводные камни, что проект в Юникоде, а вот в функцию надо передавать параметры в мультибайте. Или наоборот.

  Единственное где такое встречал, это GetProcAddress, но экспорт может быть только в ASCII кодировки без расширения, так что там пофигу.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
akizelokro
Дата 19.8.2013, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата

Единственное где такое встречал, это GetProcAddress, но экспорт может быть только в ASCII кодировки без расширения, так что там пофигу. 

Вот сейчас только тема изменения ресурсов в экзешнике с помощью Begin/UpdateResource. Часть ресурсов только в юникоде, часть строго бинарные данные.
Как-то, кажется, совсем недавно, я попал на функции установки прокси в urlmon.h. Проект на юникоде, а пока не сбросил туда обычные строки, что-то не работало). Да и постоянно такие фенечки встречаются.
А уж если цеплять обращения к html-ресурсам с различными парсерами и тому подобное, то руку на таких ещах можно набить достаточно просто.
И ещё хорошо, если переносишь какуюнибудь либу с юникса на винду и она правильно написана. А то ведь получится связывать вещи в совершенно разных кодировках порой.

А если брать ещё и ActiveX, то там в дополнение к прочим мелочам (помимо CString) выползают и BSTR.


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0609 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.