Шаг 231.
Соглашение о вызовах

    На этом шаге мы рассмотрим принятые соглашения о вызовах.

    Разрабатывая динамическую библиотеку процедур и функций, необходимо помнить, что к созданной библиотеке могут обращаться приложения, написанные на разных языках и скомпилированные в разных средах программирования. Поэтому при обращении к функциям и процедурам используются различные способы передачи их параметров. Передача параметров при вызове динамических функций производится через стек или регистры процессора. Помещаемые в стек или регистр параметры могут следовать в различном порядке. После передачи параметров стек должен очищаться вызывающим процессом или вызываемой процедурой. Поэтому соглашение о вызовах это способ передачи параметров в вызываемую функцию или процедуру.

    В таблице 1 приведены директивы соглашения о вызовах.

Таблица 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.




Предыдущий шаг Содержание Следующий шаг