Access 2002

Переменная типа Currency   


При рассмотрении кода этого примера у вас, возможно, возникнет вопрос: «Почему используется переменная типа Currency, а не Long?». В соответствии с правилами языка С, на котором написана функция GetFileSizeEx, она должна принимать в качестве аргумента адрес 64-битового целочисленного значения. Однако в VBA отсутствует аналог, в точности соответствующий этому типу. Тип Currency в VBA имеет в своем распоряжении 64 бита памяти, но далеко не весь этот объем предназначен для представления целочисленной части значения. Тип Currency предназначен для хранения значений с плавающей точкой, целая часть которых может быть представлена только четырьмя знаками. Компилятором этот тип воспринимается как целочисленный (поэтому ошибок округления не возникает), но для хранения и отображения этих значений VBA делит или умножает их на 10000. Именно по этой причине в приведенном фрагменте кода для хранения значения длины файла используется переменная типа Currency, значение которой приходится умножать перед тем, как оно будет возвращено функцией. Увы, это самый простой способ работы с большими целочисленными значениями в VBA.

Передача строк в DLL: как это происходит

Мы уже говорили о том, что в Windows определены два стандартных способа хранения строк: в форматах LPSTR и BSTR. Объявляя внешнюю функцию, вы должны указать VBA, строку какого формата следует передавать в каждом из строковых параметров. Сам VBA хранит строки в формате BSTR. Если функция ожидает получить строку типа LPSTR, VBA должен преобразовать заданную строку к этому типу. А именно так обычно и бывает, поскольку большинство DLL, включая и библиотеки Windows API, работают со строками LPSTR (кроме, разве что, COM API). Давайте разберемся в том, что собой представляют эти два типа строк.

Параметр типа LPSTR — это адрес нуль-терминированной строки (последовательности символов, оканчивающейся символом с ANSI-кодом 0). В памяти данные этого типа хранятся так:

Параметр типа BSTR похож на LPSTR с той разницей, что в начале строки данных располагаются 4 байта, в которых хранится ее длина.

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