Access 2002

Unicode — ANSI — Unicode


VBA обрабатывает эту константу по-особому. Она представляет собой четыре байта, содержащие значение О, но когда вы передаете ее функции, принимающей строковый параметр, VBA не протестует. Он помещает ее в стек как есть, понимая, что вы хотите сделать. Для обсуждавшейся нами функции setVolumeLabel, устанавливающей метку тома, второй аргумент объявляется с ключевым словом ByVal, и когда вы передаете в нем

значение vbNullString, в стек помещаются четыре байта со значением 0. Таким образом, для удаления метки тома вы пишете следующее:

Обсуждая передачу строк в DLL, мы не упомянули об одном важном обстоятельстве: VBA хранит строки в формате Unicode, а передавая их DLL-функции, конвертирует в формат ANSI. Unicode — это схема кодирования символов, в которой каждый символ имеет двухбайтовый код. В результате всего Unicode позволяет закодировать 65536 разных символов. В спецификации Unicode определены коды букв всех основных языков мира. В кодировке ANSI для хранения символа выделяется лишь один байт, и поэтому она позволяет закодировать только 256 символов.

Итак, VBA хранит все строки, с которыми работает ваша программа, в формате Unicode. Когда вы вызываете функцию из DLL, VBA преобразовывает все передаваемые ей строки в формат ANSI. При этом он создает для каждой строки временный буфер, помещает туда ANSI-эквивалент строки, а в стек — указатель на этот буфер. Когда функция завершает свою работу, VBA берет строку из буфера, преобразовывает ее в формат Unicode и копирует обратно в вашу переменную.

Выполняемое VBA преобразование формата строк влечет за собой несколько ограничений.

Никогда не пытайтесь передавать DLL-функции двоичные данные через строковые параметры.

Комментарии закрыты