На этом шаге мы рассмотрим принятые соглашения о вызовах.
Разрабатывая динамическую библиотеку процедур и функций, необходимо помнить, что к созданной библиотеке могут обращаться приложения, написанные на разных языках и скомпилированные в разных средах программирования. Поэтому при обращении к функциям и процедурам используются различные способы передачи их параметров. Передача параметров при вызове динамических функций производится через стек или регистры процессора. Помещаемые в стек или регистр параметры могут следовать в различном порядке. После передачи параметров стек должен очищаться вызывающим процессом или вызываемой процедурой. Поэтому соглашение о вызовах это способ передачи параметров в вызываемую функцию или процедуру.
В таблице 1 приведены директивы соглашения о вызовах.
Директива | Порядок следования параметров | Очищает стек, регистры | Использование регистров для передачи параметров |
---|---|---|---|
Register | Слева направо | Вызываемая процедура | Да |
Pascal | Слева направо | Вызываемая процедура | Нет |
Cdecl | Справа налево | Вызывающая процедура | Нет |
Stdcall | Справа налево | Вызываемая процедура | Нет |
Safecall | Справа налево | Вызываемая процедура | Нет |
Директива, определяющая тот или иной способ передачи параметров, приводится в заголовке процедуры или функции и указывает компилятору соглашение о вызовах, применяемое для данной функции. В языке Pascal по умолчанию всегда используется директива Register. Она определяет, что параметры будут передаваться через регистры процессора, в порядке слева направо, и регистры будет очищать вызываемая процедура. Директива Cdecl указывает компилятору, что вызов функции должен быть осуществлен в стиле языка С. Параметры загружаются в стек справа налево, затем стек очищается вызывающим процессом. Директива Pascal извещает компилятор, что необходимо сгенерировать код в стиле языка Pascal. Параметры процедуры помешаются в стек слева направо, стек очищает вызываемая процедура. Директивы Stdcall и Safecall, как и Cdecl, указывают компилятору помещать в стек параметры слева направо, но стек очищает вызываемая процедура, как в случае применения директивы Pascal. Если мы будем использовать создаваемую динамическую библиотеку для вызова процедур и функций из макросов Excel, то лучше в их описании использовать директиву Stdcall:
Function GetDateDialog:variant; Stdcall;
Рассмотрим программный код динамической библиотеки, которую мы будем использовать в макросах документов MS Excel.
На следующем шаге мы рассмотрим создание DLL, которую затем будем использовать в макросах MS Excel.