Для того чтобы приложения могли применять функции динамической библиотеки, необходимо, во-первых, экспортировать их из DLL; во-вторых, объявить функции в самом приложении как внешние. Ниже рассматриваются способы решения этих задач.

Программирование в Delphi 7

Рис. 28.1. Диалог команды Parameters меню Run

Экспорт из DLL

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

В качестве примера рассмотрим исходный код динамической библиотеки DataCheck, простейшие функции которой проверяют введенную строку перед конвертацией на соответствие одному из типов данных.

ffl-™-~-"'™........-■:-',т-........17-™т"""™"Т'-'':......................г............„.;......т^-7.г...............

! Листинг 28.2. Исходный код динамической библиотеки DataCheck, - _. ]

library DataCheck;

uses

Windows, SysUtils, Classes, Messages, Forms, Dialogs, StdCtrls, ComCtrls;

function ValidDate(AText: String): Integer; begin try Result := 0; StrToDate(AText); except

on E:EConvertError do Result :=-l;
end;
end;

function ValidTime(AText: String): Integer; begin try

Result := 0; StrToTime(AText) ' ; except

on E:EConvertError do Result := -1;
end;
end;

function Validlnt(AText: String): Integer; begin try

Result := 0;
StrToInt(AText);

except

on E:EConvertError do Result := -1;
end;
end;

exports Validlnt,

ValidDate index 1, ValidTime index 2 name 'IsValidTime';

begin if Length(DateToStr(Date)) < 10

then ShowMessage('Год представлен двумя цифрами') ; end.

Итак, три функции этой библиотеки обеспечивают проверку строки перед преобразованием ее в целое число, дату или время. Для обеспечения экспорта этих функций их необходимо объявить в секции exports.

При компиляции библиотеки адрес, имя и порядковый номер экспортируемой функции добавляется к специальной таблице экспорта в файле DLL.

( Примечание }

Компилятор Delphi без проблем добавит таблицу экспорта и к исполняемому файлу приложения. Правда, при этом получить доступ к такой функции невозможно-это системное ограничение Windows.

Попробуйте объявить пару функций после ключевого слова exports в обычном приложении - проект компилируется без ошибок. Но сами функции недоступны другим процессам.

Имена процедур и функций в секции экспорта разделяются запятыми. Внимательный взгляд на пример экспорта в листинге 28.2 обнаруживает три различных варианта объявления.

В первом варианте компилятор самостоятельно определяет положение функции в таблице экспорта.

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

Ключевое слово name позволяет экспортировать функцию под другим именем.

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

При объявлении процедур и функций в динамических библиотеках используются различные соглашения о вызовах. Дело в том, что различные языки программирования по-разному реализуют передачу параметров в процедуру (через стек или регистры). Порядок следования параметров в стеке как раз определяется соглашением о вызовах.


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Август
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс