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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с unicode 
:(
    Опции темы
suvolod
Дата 11.3.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Помогите! Познакомился недавно с уникоде, ну и решил написать небольшой пример с полной поддержкой уникоде. Вот программа, которая перечисляет все процессы в системе и выводит их в диалоговом окне.
Код

#include "stdafx.h"
//#include <tchar.h>
#include <tlhelp32.h>


void DeleteProcess();

int WINAPI wWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
    DeleteProcess();
    return(0);
}

void DeleteProcess()
{
    
    HANDLE hSnap;
    wchar_t* str;            //буфер
    
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap == NULL) 
    {
        MessageBoxW(NULL, L"Error Load ToolHelp",L"",MB_OK);        
    }
    PROCESSENTRY32 proc;
    if (Process32First(hSnap, &proc))
    {
        while (Process32Next(hSnap, &proc)) 
        {
            
            //if (!IsTextUnicode(proc.szExeFile, 256, NULL))
            {
            
            int cnt=MultiByteToWideChar(NULL, NULL, proc.szExeFile, -1,NULL,0);
            str=new wchar_t[cnt];
            MultiByteToWideChar(NULL, NULL, proc.szExeFile, -1,str,cnt*sizeof(wchar_t));
            MessageBoxW(NULL, str,L"",MB_OK);
            delete str;
            
            }
        }
    }
}

В общем-то столкнулся с проблемами почти сразу. Очень много свойств/параметров стандартных объектов заданы в формате 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-массив.

PM MAIL   Вверх
LPBOY
Дата 11.3.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(suvolod @ 11.3.2006, 14:03 Найти цитируемый пост)
Может есть более простые способы работы с Unicode, о которых я не знаю??? – пожалуйста, подскажите.


Цитата(suvolod @ 11.3.2006, 14:03 Найти цитируемый пост)
это поле определяется так:
WCHAR szExeFile[MAX_PATH];


На самом деле вот так:
TCHAR szExeFile[MAX_PATH];

Если определен макрос _UNICODE, то TCHAR == wchar_t, а если не определен, то == char. Так что ничего преобразовывать не нужно. Только раскомментируй #include <tchar.h>. Литеральные строки надо обертывать в макрос _T("literal string").
Кстати у Рихтера это все отлично расписано, вопросов возникать не должно...

--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
suvolod
Дата 11.3.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я вообще-то определял и UNICODE, и _UNICODE. А tchar.h закомментировал сознательно, мне интересно было поработать с не универсальным типом данных TCHAR, а напрямую с wchar_t, то есть создать проект только для unicode-компиляции...
Добавлено @ 16:01
Так, кажется, я начинаю разбираться!
Оказыватся, я смотрел такое опредение:

Код

typedef struct tagPROCESSENTRY32W
{
DWORD   dwSize;
DWORD   cntUsage;
DWORD   th32ProcessID;          // this process
DWORD   th32DefaultHeapID;
DWORD   th32ModuleID;           // associated exe
DWORD   cntThreads;
DWORD   th32ParentProcessID;    // this process's parent process
LONG    pcPriClassBase;         // Base priority of process's threads
DWORD   dwFlags;
WCHAR   szExeFile[MAX_PATH];    // Path
} PROCESSENTRY32W;


Глаз замылился, и букву W в конце названия структуры не увидел. То есть для работы с unicode мне надо использовать структуру с окончанием W.

Блин, еще больше проблем появилось. Теперь в каждой tool-help фции прийдется дописывать W, ну или работать с универсальными типами данных.
PM MAIL   Вверх
suvolod
Дата 11.3.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Что-то я запутался окончательно... по идее, никаких W дописывать не надо, достаточно определить константу UNICODE, и фция сама развернется в функцию для работы с широкобайтными символами. Но почему, клгда я это делаю, все фции разворачиваются в A-прототипы и компилятор плюется ошибками. Я уже переписал программу вот так:

Код

// 009.cpp : Defines the entry point for the application.

#define UNICODE
#define _UNICODE

#include "stdafx.h"

int WINAPI wWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL,L"Hello",L"",MB_OK);    //ругается...
    return (0);
}


И даже с таким кодом выскакивает ошибка:
'MessageBoxA' : cannot convert parameter 2 from 'unsigned short [6]' to 'const char *'

Как будто unicode-константы я и не определял smile((
Добавлено @ 16:41
Разобрался, помогили на форуме source.ru

Я определял констнаты перед stdafx.h. А надо было в самом этом заголовочном файле
Определил константы в stdafx.h и все заработало!
мне непонятно только, почему компилятор игнорирует все директивы перед этим заголовочным файлом ....
Просмотрел код этого заголовка, но ничего особенного в нем не увидел... Точнее, для меня его код малопонятен, всю зашифровано макросами. Если не сложно, поясните, какая из строчек дает команду игнорировать определения перед этим файлом

PM MAIL   Вверх
np9mi7
  Дата 11.3.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 она тоже есть, только вот точный путь уже не скажу;


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
LPBOY
Дата 11.3.2006, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(suvolod @ 11.3.2006, 16:29 Найти цитируемый пост)
Если не сложно, поясните, какая из строчек дает команду игнорировать определения перед этим файлом


Игнорируется любая абра-кадабра перед #include "stdafx.h".
Код

 84s 8943ds jkds
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

компилируется без ошибок. - Особенность компилятора.
--------------------
Каждый человек по-своему прав, а по-моему нет...
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.0994 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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