Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2013, 12:01   #1
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию Не работает WideCharToString - вместо букв квадратики

Ну собственно,в миллионный раз на эти грабли наступаем и опять получаем по лбу:
Код:
 AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 3] of Char;
    Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of Char;
Embarcadero XE2 юникодная,поэтому Char=WideChar что логично.
Код:
TmpPointer: PIP_ADAPTER_INFO;
showmessage(WideCharToString(TmpPointer^.AdapterName)+' '+AnsiString(TmpPointer^.Description));
Выдает квадратики. А если Char заменить на AnsiChar, а WideCharToString на String, то работает.
Но почему не хочет с WideChar конвертить? На другой программе этот метод отлично работал. Даже так не помогает:
WideCharToString(PWideChar(WideChar ToString(....)))
calypso вне форума Ответить с цитированием
Старый 31.07.2013, 12:14   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Открой для себя класс TEncoding, он специально предназначен для конвертации.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.07.2013, 18:21   #3
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Там проблема похоже в другом.А именно,структура PIP_ADAPTER_INFO и её параметры AdapterName и Description являются строго ANSI строками. Так написано в MSDN. Маразм Microsoft в том,что у них часть функций работает только с PChar,часть только с ANSI, а апишные функции все данные берут в Юникоде.
И приходится 10% посвящать самому алгоритму проги,а 90% сидеть переводить строки из одного типа в другой
calypso вне форума Ответить с цитированием
Старый 31.07.2013, 19:24   #4
Avazart
Форумчанин
 
Аватар для Avazart
 
Регистрация: 13.08.2011
Сообщений: 184
По умолчанию

Так чем не устраивает перевод c помощью VCL ?
Avazart вне форума Ответить с цитированием
Старый 31.07.2013, 20:57   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от calypso Посмотреть сообщение
Но почему не хочет с WideChar конвертить? На другой программе этот метод отлично работал.
Внимательно подумай, что ты написал в своем коде. Только что сам говоришь, что Char = WideChar и что данные поступают в виде AnsiChar, но в коде их упорно пытаешься выдать за WideChar. Чуда не бывает, оттого и квадратики.

Должно сработать так:
Код:
begin
  ShowMessage(AnsiString(@TmpPointer.AdapterName)+ ' ' + AnsiString(@TmpPointer.Description));
end;
Можешь посмотреть в ассемблерном подстрочнике, что получится. Поскольку в Delphi все строковые типы имеют дополнительную поддержку со стороны компилятора, при передаче AnsiString в UnicodeString будет вызвана библиотечная процедура перевода символов в нужное представление.
Vapaamies вне форума Ответить с цитированием
Старый 01.08.2013, 11:46   #6
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Цитата:
Должно сработать так:
Код:
begin
ShowMessage(AnsiString(@TmpPointer. AdapterName)+ ' ' + AnsiString(@TmpPointer.Description) );
end;
Не работает,выводится пустота. Скорее всего,в эти переменные попросту не записывается информация когда они юникодные. Раз в MSDN указано ANSI,это наверно не просто так. Вопрос конечно интересный,хотелось бы докопаться до истины.
calypso вне форума Ответить с цитированием
Старый 01.08.2013, 12:08   #7
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

Цитата:
Скорее всего,в эти переменные попросту не записывается информация когда они юникодные.
Что-то из области фантастического программирования, кажется...
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Старый 01.08.2013, 12:35   #8
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Цитата:
Что-то из области фантастического программирования, кажется...
Как знать, Борландовский компилятор иногда и не такие косяки пропускает.Это на Visual Studio всё строго по MSDN,если хоть шаг в сторону - файл не скомпилируется
calypso вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
каракули вместо русских букв tresh HTML и CSS 20 21.10.2014 19:17
Квадратики вместо текста в Word GreenPeace Microsoft Office Word 1 07.06.2013 00:03
Пустота вместо русских букв MrBrain WordPress и другие CMS 1 02.06.2013 00:10
Квадратики вместо букв в Edit1->Text calypso C++ Builder 1 22.03.2013 15:15
квадратики вместо переноса строки Fok Работа с сетью в Delphi 4 15.11.2010 00:30