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

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

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

   
В таблице 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.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий