Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows


Создание программ, способных использовать и ANSI, и Unicode - часть 2


/p>

Они реализованы как макросы, вызывающие либо Unicode-, либо ANSI-версию функции в зависимости от того, определен ли UNICODE при компиляции исходного модуля Например, если UNICODE не определен, lstrcat раскрывается в lstrcatA, определен — в lstrcatW.

Строковые функции lstrcmp и lstrcmpi ведут себя не так, как их аналоги из библиотеки С (strcmp, strcmpi, wcscmp и wcscmpf), которые просто сравнивают кодовые позиции в символах строк. Игнорируя фактические символы, они сравнивают числовое значение каждого символа первой строки с числовым значением символа второй

строки. Но lstrcmp и lstrcmpi реализованы через вызовы Windows-функции CompareString;

int CompareString(
LCID lcid,
DWORD fdwStyle,
PCWSTR pString1,
int cch1,
PCWSTR pString2,
int cch2);

Она сравнивает две Unicode-строки. Первый параметр задаст так называемый идентификаторлокализации (locale ID, LCID) — 32-битное значение, определяющее конкретный язык. С помощью этого идентификатора CompareString сравнивает строки с учетом значения конкретных символов в данном языке. Так что она действует куда осмысленнее, чем функции библиотеки С.

Когда любая из функций семейства lstrcmp вызывает CompareString, в первом параметре передается результат вызова Windows-функции GetThreadLocale.

LCID GetThreadLocale();

Она возвращает уже упомянутый идентификатор, который назначается потоку в момент его создания.

Второй параметр функции CompareString указывает флаги, модифицирующие метод сравнения строк. Допустимые флаги перечислены в следующей таблице.

Флаг

Действие

NORM_IGNORECASE

Различия в регистре букв игнорируются

NORM_IGNOREKANATYPE

Различия между знаками хираганы и катаканы игнорируются

NORM_IGNORENONSPACE

Знаки, отличные от пробелов, игнорируются

NORM_IGNORESYMBOLS

Символы, отличные от алфавитно-цифровых, игнорируются

NORM_IGNOREWIDTH

Разница между одно- и двухбайтовым представлением одного
и того же символа игнорируется

SORT_STRINGSORT

Знаки препинания обрабатываются так же, как и символы, от-
личные от алфавитно-цифровых

<


Начало  Назад  Вперед



Книжный магазин