MultiByteToWideChar в WindowsCE???
От: Karabinos Украина  
Дата: 28.02.03 15:13
Оценка:
Уважаемые, есть вопрос!

MultiByteToWideChar — как работает эта функция?
И как написать свою ?
Это нужно для PocketPC.

На десктопе под WindowsXP происходит следующее:
char*    AnsiName = "Film Игла";
int      size = strlen(AnsiName)+1;
WCHAR*   UnicodeName = new WCHAR[size];

MultiByteToWideChar(CP_ACP,0, AnsiName,size,UnicodeName,size);

__int64 a_HashSumXP = ::GetHashSum(UnicodeName,size);


А затем делаем тоже самое на PocketPC:

......
__int64 a_HashSumCE = ::GetHashSum(UnicodeName,size);


И вот получается что эти a_HashSumXX не равны!!

Может это потому, что в строке есть буквы и из латиницы и из кириллицы?

12.09.03 18:32: Перенесено модератором из 'WIN API' — AS
Меньше читай, больше думай. (А.Сурожский)
Re: MultiByteToWideChar в WindowsCE???
От: serg_p Украина  
Дата: 28.02.03 15:28
Оценка:
Не мучайтесь — там где нужны wide string пишите L"This is wide string".
Re[2]: MultiByteToWideChar в WindowsCE???
От: Karabinos Украина  
Дата: 28.02.03 15:41
Оценка:
Здравствуйте, serg_p, Вы писали:

SP>Не мучайтесь — там где нужны wide string пишите L"This is wide string".


Дело втом что в наших dll-ах и exe-ах очень много текста.
Описание всяких классов, методанные короче.
И вот если их делать все как L"This is wide string",
то получаются dll-ки очень большого размера примерно на 500kb больше чем
ANSI строки. Для PocketPC это весомо.
А так как к методанным редко доступ нужен, то и решили
все строки в ANSI, а при чтении конвертить их в Unicode.
Под XP работает под CE нет.
Причем не на всех PocketPC. На COMPAQ работает, на Toshiba нет.
И все дело в этой самой MultiByteToWideChar .
Надо написать свою. Вот и вопрос: как?
Меньше читай, больше думай. (А.Сурожский)
Re[3]: MultiByteToWideChar в WindowsCE???
От: VVV Россия  
Дата: 28.02.03 19:52
Оценка:
Здравствуйте, Karabinos, Вы писали:

K>Здравствуйте, serg_p, Вы писали:


SP>>Не мучайтесь — там где нужны wide string пишите L"This is wide string".


K>Дело втом что в наших dll-ах и exe-ах очень много текста.

K>Описание всяких классов, методанные короче.
K>И вот если их делать все как L"This is wide string",
K>то получаются dll-ки очень большого размера примерно на 500kb больше чем
K>ANSI строки. Для PocketPC это весомо.
K>А так как к методанным редко доступ нужен, то и решили
K>все строки в ANSI, а при чтении конвертить их в Unicode.
K>Под XP работает под CE нет.
K>Причем не на всех PocketPC. На COMPAQ работает, на Toshiba нет.
K>И все дело в этой самой MultiByteToWideChar .
K>Надо написать свою. Вот и вопрос: как?

1. может, тогда считать GetHashSum не от юникодных строк, а прямо от ANSI?
2. просто предположение: может всё дело в региональных сетингах? Где локале стоит Россия, там работает?
3. может, вместо CP_ACP поставить 1251?
Re: MultiByteToWideChar в WindowsCE???
От: Frostbitten Россия  
Дата: 01.03.03 18:08
Оценка: 16 (3)
Здравствуйте, Karabinos, Вы писали:

K>И вот получается что эти a_HashSumXX не равны!!


Проверьте, возвращает ли ::GetACP() равные значения там и там.
Если не уверены, то пишите:

::MultiByteToWideChar(
   1251,              // (*)
   0, 
   AnsiName,size,
   UnicodeName,size);


(*) Обязательное условие соответствия результатов на всех девайсах... кроме тех, у которых нет этой страницы и эта функция вернет 0, см. ниже.

K>Может это потому, что в строке есть буквы и из латиницы и из кириллицы?

Нет.

K>MultiByteToWideChar — как работает эта функция?

Эта функция работает по таблице, находящейся в NLS структуре для заданной кодовой страницы.
Следует помнить, что многие девайсы без руссификаторов не имеют NLS для кирилицы вообще (хотя шрифты есть и все отображается без проблем).
И даже те, что с руссификаторами могут иметь в ::GetACP() КОИ'вую установку — почту читать

K>И как написать свою ?

Не понял вопроса. Все сводится к

static const WCHAR _ansi1251toUnicodeMap[256] =
{
   ... // (**)
};


(**) Генериться за 5 минут на большом.

BYTE  cAnsi1251[256];
WCHAR wcUnicode[256];
int   i;

for (i =0; i < 256; i++)
   cAnsi1251[i] = i;

::MultiByteToWideChar(
   1251,
   0, 
   &cAnsi1251[0],
   256,
   &wcUnicode[0],
   256);


Далее дело техники.

P. S.
На моем хомяке проект по руссификация BE-300 (WinCE 3.0), так вот там я полностью переписывал именно ::MultiByteToWideChar() (прямо системную, прямо в пямяти). Исходники свободны (хотя и не опубликованы), но из за особой специфики они на MIPS asm.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.