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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как привести переменную типа char* к wchar_t*? 
:(
    Опции темы
Коп
  Дата 19.7.2003, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



notify.gif notify.gif notify.gif notify.gif
PM MAIL ICQ   Вверх
RAN
Дата 19.7.2003, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

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



Способов много. Два самых популярных:

Через API
Функции MultibyteToWideChar и WideCharToMultiByte из winnls.h

через макросы ATL
USES_CONVERSION; W2A или A2W

Второй способ по сути является надстройкой первого и раскрывается примерно следующим способом

ATL
Код

   USES_CONVERSION;
   char* AnsiText;
   wchar_t WideText[] = L"Test string";
   AnsiText = W2A(WideText); //преобразование из wchar_t* к char*
   wchar_t* NewWideText;
   NewWideText = A2W(AnsiText); //и обратно


если раскрыть макросы, то получится что-то типа
Код

//    USES_CONVERSION;
   int _convert = 0;
   UINT _acp = GetACP();
   char* AnsiText;
   wchar_t WideText[] = L"Test string";

//  AnsiText = W2A(WideText);
   _convert = lstrlenW(WideText) + 1; //сколько символов в строке?
   AnsiText = (char*)alloca(_convert); //выделяем память для новой строки
   WideCharToMultiByte(_acp, 0, WideText, -1, AnsiText, _convert, NULL, NULL);

   wchar_t* NewWideText;
//    NewWideText = A2W(AnsiText);
   _convert = lstrlenA(AnsiText) + 1;
   NewWideText = (wchar_t*)alloca(_convert * 2);
   MultiByteToWideChar(_acp, 0, AnsiText, -1, NewWideText, _convert);

PM MAIL ICQ   Вверх
Коп
Дата 23.7.2003, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я использовал функцию MultiBiteToWideChar, но во время работы (не при компиляции) программа выдает ошибку:

Access volation at address 77E77DFA in module 'kernel32.dll'. Write of address 4005D286.

Причем в '98 и XP адреса разные.

Может быть я где-то ошибся в параметрах:

Код

char *ASD = "C:\\WWW\\123.lnk";
wchar_t *wASD;
MultiByteToWideChar(CP_ACP, 0, ASD, -1, wASD, MAX_PATH);

PM MAIL ICQ   Вверх
shedon
Дата 23.7.2003, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

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



Код

wchar_t *wASD;
MultiByteToWideChar(CP_ACP, 0, ASD, -1, wASD, MAX_PATH);

Цитата
Я использовал функцию MultiBiteToWideChar, но во время работы (не при компиляции) программа выдает ошибку:
Access volation at address 77E77DFA in module 'kernel32.dll'. Write of address 4005D286.

Всё правильно! Ты не инициализировал wASD, не выделил под неё память.



--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
Коп
Дата 23.7.2003, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(shedon @ 23.7.2003, 09:50)
Ты не инициализировал wASD, не выделил под неё память.

Это
Код
wchar_t *wASD = (wchar_t *) malloc(MAX_PATH);
?
PM MAIL ICQ   Вверх
shedon
Дата 23.7.2003, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

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



[QUOTE]
[/CODE]wchar_t *wASD = (wchar_t *) malloc(MAX_PATH);
Код

?
[/QUOTE]
Тебе [B]RAN[/B] написал
wchar_t *wASD = (wchar_t *) alloca(MAX_PATH*2);
[CODE]


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
RAN
Дата 23.7.2003, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

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



Использую alloca для временных переменных, память автоматом освобождается при выходе из функции, а malloc придётся освобождать самому.
PM MAIL ICQ   Вверх
Коп
Дата 23.7.2003, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ок, спасибо!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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