Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ ОФИСНОГО ПРОГРАММИРОВАНИЯ И ЯЗЫК VBA - 2....doc
Скачиваний:
79
Добавлен:
17.12.2018
Размер:
1.62 Mб
Скачать

Два языка: c и vb. Различия при вызове функций

Итак, чтобы корректно вызывать Win32 API функции на VBA, следует разбираться, чем отличаются вызовы функций в языках C и Visual Basic (VBA). Даже, если используется обозреватель API Viewer, который автоматически транслирует типы языка C в типы языка VBA, знание этих различий необходимо во многих ситуациях.

Соответствие между простыми типами данных

Нижеследующая таблица описывает соответствие между некоторыми, простыми типами данных двух языков:

Таблица 6.1. Соответствие между типами языков C и VBA

C/C++ тип данных

Венгерская нотация

Описание

Тип языка VBA

BOOL

b

8-и битное булево значение. Значение 0 эквивалентно False, ненулевое значение - True

Boolean или Long

BYTE

ch

8-и битное целое без знака

Byte

HANDLE

h

32 -х битное целое без знака, задающее описатель Windows -объектов

Long

int

n

2-х байтное целое со знаком

Integer

UINT

u

2-х байтное целое без знака

Long

DWORD

dw

4-х байтное целое без знака

Long

long

l

4-х байтное целое со знаком

Long

LP

lp

32-х битный указатель на C/C++ структуры, строки, функции или другие данные в памяти

Long

LPZSTR

lpsz

32-х битный указатель на C строку, завершаемую нулем

Long

При преобразовании данных между типами UINT и DWORD и типом Long могут возникнуть проблемы, если заданы некорректные значения этих данных. Понятно, что если параметр функции API объявлен как UINT, то возникнет ошибка при попытке передать через тип Long отрицательное значение или длинное целое, превосходящее значение, допустимое для типа UINT. Конечно, нужно быть или осторожным или ввести собственные типы данных, где все необходимые проверки будут выполняться.

Структуры языка c и тип, определенный пользователем, в языке vba

В языке C можно определять записи - совокупность данных разного типа. Такие записи в языке C называются структурами. Обычно, вначале определяется соответствующий структурный тип, а затем имя этого типа используется при объявлении конкретных переменных. Структуры могут передаваться в качестве аргументов при вызове функций, в том числе при вызове Win32 API функций. В VBA, как известно, для задания подобного структурного типа используется конструкция Type…End Type, называемая типом, определенным пользователем. Переменные такого типа передаются вызываемой функции обычным способом: X As T, где T - имя пользовательского типа. Позже мы приведем пример вызова функции Win32 API, которой передается структура в качестве аргумента.

Об описателях языка c и объектах Windows

В языке C особенно при работе с объектами Windows, широко используется тип Handle - задающий описатели объектов. Когда создаются объекты ядра операционной системы и такие основные объекты, как окна, - все они снабжаются описателем, имеющим тип Handle. Описатель представляет длинное целое и однозначно идентифицирует объект. Всегда, когда в функцию Win32 API необходимо передать такой объект, то реально передается его описатель. При трансляции описателей в тип языка VBA ему ставится в соответствие тип Long. При этом желательно понимать, что речь все-таки идет об описателях, создаваемых операционной системой, в момент создания соответствующего объекта. Соответствующие примеры будут даны чуть позже.