Поделиться через


Соглашения для прототипов функций

Пакет SDK для Windows предоставляет прототипы функций в универсальных кодовой странице Windowsи версиях Юникода. Прототипы можно скомпилировать для создания прототипов кодовой страницы Windows или прототипов Юникода. Все три прототипа рассматриваются в этом разделе и иллюстрируются примерами кода для функции SetWindowText.

Ниже приведен пример универсального прототипа.

BOOL SetWindowText(
  HWND hwnd,
  LPCTSTR lpText
);

Файл заголовка предоставляет универсальное имя функции, реализованное как макрос.

#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE

Препроцессор расширяет макрос на кодовую страницу Windows или имя функции Юникода. Буква "A" (ANSI) или "W" (Юникод) добавляется в конце имени универсальной функции по мере необходимости. Затем файл заголовка предоставляет два конкретных прототипа, один для кодовых страниц Windows и один для Юникода, как показано в следующих примерах.

BOOL SetWindowTextA(
  HWND hwnd,
  LPCSTR lpText
);
BOOL SetWindowTextW(
  HWND hwnd,
  LPCWSTR lpText
);

Как описано в типов данных Windows для строк, прототип универсальной функции использует тип данных LPCTSTR для текстового параметра. Однако прототип кодовой страницы Windows использует тип LPCSTR, а прототип Юникода использует LPCWSTR.

Для всех функций с текстовыми аргументами приложения обычно должны использовать прототипы универсальных функций. Если приложение определяет "ЮНИКОД" до #include инструкций для файлов заголовков или во время компиляции, инструкции будут скомпилированы в функции Юникода.

Заметка

Новые приложения Windows должны использовать Юникод, чтобы избежать несоответствий различных кодовых страниц и для удобства локализации. Они должны быть написаны с помощью универсальных функций и должны определять ЮНИКОД для компиляции функций в функции Юникода. В нескольких местах, где приложение должно работать с 8-разрядными символьными данными, оно может явно использовать функции для кодовых страниц Windows.

 

Приложение всегда должно использовать прототип универсальной функции с универсальными типами строк и символов. Все имена функций, заканчивающиеся верхним регистром "W", принимают Юникод, то есть широкий символ, параметры. Некоторые функции существуют только в версиях Юникода и могут использоваться только с соответствующими типами данных. Например, LCIDToLocaleName и LocaleNameToLCID имеют только версии Юникода.

В разделе "Требования" в справочной документации для каждой функции Юникода и набора символов содержатся сведения о версиях функций, реализованных поддерживаемыми операционными системами. Если включена строка, начинаемая с Юникода, функция имеет отдельные версии юникода и кодовой страницы Windows.

Заметка

Если функция имеет параметр длины для символьной строки, длина должна быть задокументирована в виде количества значений TCHAR в строке. Этот тип данных относится к байтам для версий кодовой страницы Windows функции или 16-разрядных слов для версий Юникода. Однако функции, требующие или возвращающие указатели на нетипизированные блоки памяти, такие как функция GlobalAllocGlobalAlloc, обычно принимают размер в байтах независимо от используемого прототипа. Если выделение нетипизированной памяти предназначено для строки, приложение должно умножить количество символов по размеру (TCHAR). Дополнительные сведения см. в разделе Использование универсальных типов данных.

 

Юникод в API Windows