![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
suvolod |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 20.8.2005 Репутация: нет Всего: 1 |
Помогите! Познакомился недавно с уникоде, ну и решил написать небольшой пример с полной поддержкой уникоде. Вот программа, которая перечисляет все процессы в системе и выводит их в диалоговом окне.
В общем-то столкнулся с проблемами почти сразу. Очень много свойств/параметров стандартных объектов заданы в формате ANSI. И возникает необходимость постоянно такие ansi-параметры преобразовывать к типу unicode. 1// Например, возьмем proc.szExeFile. У меня это массив обычных char-символов. Получается, чтобы подставить такой парам в функцию, мне надо преобразовать его в unicode – а для этого фактически создать новую переменную-буфер, найти нужный размер буфера, выделить под него память, заполнить, а потом еще и удалить после использования. Как представлю, что мне везде придется прописывать столько лишнего кода перед использованием функций c unicode-параметрами, берет тоска…. Даже если все эти действия завернуть в две функции (одну для создания Unicode-строки, другую для ее удаления после использования), все равно неудобно – перед вызовом каждой функции придется создавать/инициализировать переменные для размещения Unicode-строк + следить за тем, чтобы после использования эти переменные были обнулены (освободили занимаемую Unicode-строкой память). Вопрос. Может есть более простые способы работы с Unicode, о которых я не знаю??? – пожалуйста, подскажите. Я попробовал сделать так: L(proc.szExeFile), но компилятор такую строку не проглотил, говорит, что ему неизвестен оператор L, хотя, например, L"Hello" пропускает нормально и трактует такую запись, как unicode-строку. //2 Еще один вопрос возник у меня по самому параметру proc.szExeFile. Я посмотрел описание структуры PROCESSENTRY32, там это поле определяется так: WCHAR szExeFile[MAX_PATH]; // Path То есть по идее это должен быть массив unicode-символов. Но VC++ при компиляции ругается, и говорит, что proc.szExeFile – это массив char символов. Я не пойму, почему (где?!!) он преобразует это поле в массив однобайтных символов, если в структуре ясно указано, что это unicode-массив. |
|||
|
||||
LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
На самом деле вот так: TCHAR szExeFile[MAX_PATH]; Если определен макрос _UNICODE, то TCHAR == wchar_t, а если не определен, то == char. Так что ничего преобразовывать не нужно. Только раскомментируй #include <tchar.h>. Литеральные строки надо обертывать в макрос _T("literal string"). Кстати у Рихтера это все отлично расписано, вопросов возникать не должно... --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
suvolod |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 20.8.2005 Репутация: нет Всего: 1 |
Я вообще-то определял и UNICODE, и _UNICODE. А tchar.h закомментировал сознательно, мне интересно было поработать с не универсальным типом данных TCHAR, а напрямую с wchar_t, то есть создать проект только для unicode-компиляции...
Добавлено @ 16:01 Так, кажется, я начинаю разбираться! Оказыватся, я смотрел такое опредение:
Глаз замылился, и букву W в конце названия структуры не увидел. То есть для работы с unicode мне надо использовать структуру с окончанием W. Блин, еще больше проблем появилось. Теперь в каждой tool-help фции прийдется дописывать W, ну или работать с универсальными типами данных. |
|||
|
||||
suvolod |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 20.8.2005 Репутация: нет Всего: 1 |
Что-то я запутался окончательно... по идее, никаких W дописывать не надо, достаточно определить константу UNICODE, и фция сама развернется в функцию для работы с широкобайтными символами. Но почему, клгда я это делаю, все фции разворачиваются в A-прототипы и компилятор плюется ошибками. Я уже переписал программу вот так:
И даже с таким кодом выскакивает ошибка: 'MessageBoxA' : cannot convert parameter 2 from 'unsigned short [6]' to 'const char *' Как будто unicode-константы я и не определял ![]() Добавлено @ 16:41 Разобрался, помогили на форуме source.ru Я определял констнаты перед stdafx.h. А надо было в самом этом заголовочном файле Определил константы в stdafx.h и все заработало! мне непонятно только, почему компилятор игнорирует все директивы перед этим заголовочным файлом .... Просмотрел код этого заголовка, но ничего особенного в нем не увидел... Точнее, для меня его код малопонятен, всю зашифровано макросами. Если не сложно, поясните, какая из строчек дает команду игнорировать определения перед этим файлом |
|||
|
||||
np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
suvolod, какое IDE ты используешь? Если Microsoft Visual Studio 2005, то есть опция в настройках проекта: Project->Properties->Configuration Properties->General->Charaster Set = {Not Set, Use Unicode Character Set, Use Multi-Byte Character Set}. Опция зависима от конфигурации сборки, то есть при смене Debug на Release придеться её опять менять. Для Microsoft Visual Studio 2003 или Microsoft Visual Studio 6.0 она тоже есть, только вот точный путь уже не скажу;
|
|||
|
||||
LPBOY |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Игнорируется любая абра-кадабра перед #include "stdafx.h".
компилируется без ошибок. - Особенность компилятора. --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |