exports Validlnt, ValidDate index 1, ValidTime index 2 name 'IsValidTime';
begin
if Length(DateToStr(Date)) < 10
then ShowMessage('Год представлен двумя цифрами');
end.
(Слайд 16)
Итак, три функции этой библиотеки обеспечивают проверку строки перед преобразованием ее в целое число, дату или время. Для обеспечения экспорта этих функций их необходимо объявить в секции exports.
При компиляции библиотеки адрес, имя и порядковый номер экспортируемой функции добавляется к специальной таблице экспорта в файле DLL.
(Слайд 17)
Компилятор Delphi без проблем добавит таблицу экспорта и к исполняемому файлу приложения. Правда, при этом получить доступ к такой функции невозможно — это системное ограничение Windows.
Попробуйте объявить пару функций после ключевого слова exports в обычном приложении — проект компилируется без ошибок. Но сами функции недоступны другим процессам.
Имена процедур и функций в секции экспорта разделяются запятыми. Внимательный взгляд на пример экспорта в листинге 28.2 обнаруживает три различных варианта объявления.
В первом варианте компилятор самостоятельно определяет положение функции в таблице экспорта.
При использовании ключевого слова index следующее за ним число задает положение функции в таблице экспорта относительно других таких же функций.
Ключевое слово name позволяет экспортировать функцию под другим именем.
(Слайд 18)
При объявлении процедур и функций в динамических библиотеках используются различные соглашения о вызовах. Дело в том, что различные языки программирования по-разному реализуют передачу параметров в процедуру (через стек или регистры). Порядок следования параметров в стеке как раз определяется соглашением о вызовах. (Слайд 19)
Стандартный вызов в языках C++ и Object Pascal различается, но набор директив смены типа вызова позволяет обеспечить любую реализацию.
Во всех соглашениях о вызовах вызывающая процедура помещает параметры в стек. В зависимости от типа соглашения, очистка стека осуществляется вызывающей или вызываемой процедурой.
Если очистка стека выполняется вызывающей процедурой, то она успевает забрать из него возвращаемые значения.
Если очистка стека осуществляется вызываемой процедурой, то перед этим она помещает возвращаемые значения во временную область памяти. (Слайд 20)