Конфигурация локали и ее связь с Windows API

Может ли конфигурация локали системы ИЛИ конфигурация типа клавиатуры этой системы в любом случае повлиять на то, какой API вызывается на уровне ядра? В частности, если программа вызывает API "CreateFile ()", то в документации Windows API говорится, что вызов делегируется либо CreateFileA, либо CreateFileW. Если эта программа запускается в китайской системе с китайской клавиатурой, то какая из двух функций будет вызвана?

1 ответ

Решение

Unicode и Locale - это две совершенно ортогональные концепции.

Что касается CreateFileA против CreateFileW - параметр, который управляет этим параметром, является параметром времени компиляции: если приложение скомпилировано для работы с набором символов Unicode, тогда CreateFileW будет вызван, если в настройках компиляции указано, что приложение должно быть скомпилировано как многобайтовое приложение, то CreateFileA будет называться.

Если вы используете Visual Studio C++, проверьте параметры проекта приложения. В разделе "Свойства конфигурации" на странице "Общие" будет параметр "Набор символов" - для него можно установить "Использовать набор символов Юникода" или "Использовать многобайтовый набор символов". Эффект этого параметра заключается в автоматическом добавлении еще одного листа свойств к решению, который отображается под Диспетчером свойств: на листе свойств "Поддержка Unicode" добавляются определения препроцессора "._UNICODE,UNICODE"- на странице свойств" Поддержка многобайтовых символов "вместо этого добавляется"_MBCS".

Теперь, если вы посмотрите на определение для CreateFile вы увидите, что это сам макрос, и когда вы создаете приложение, все CreateFile звонки в коде разрешат CreateFileW звонки, если UNICODE определяется, и CreateFileA звонит иначе.

UNICODE используется windows.h переключаться между версиями Windows API и Wide и Ansi.

_MBCS а также _UNICODE используются заголовками времени выполнения Microsoft C - главным образом, tchar.h - для переключения библиотеки c с поддержки однобайтовых многобайтовых символов на символы Юникода в функциях, которые поддерживают это.

Другие вопросы по тегам