Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на языке Delphi_3.doc
Скачиваний:
44
Добавлен:
28.03.2015
Размер:
1.71 Mб
Скачать

5.2. Разработка библиотеки

5.2.1. Структура библиотеки

По структуре исходный текст библиотеки похож на исходный текст программы, за исключением того, что текст библиотеки начинается с ключевого слова library, а не слова program. Например:

library SortLib;

После заголовка следуют секции:

  • подключения модулей;

  • описания констант, типов данных, переменных;

  • описания процедур и функций.

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

Если в теле библиотеки объявлены некоторые процедуры,

procedure BubleSort(var Arr: array of Integer);

procedure QuickSort(var Arr: array of Integer);

то это еще не значит, что они автоматически будут доступны для вызова извне. Для того чтобы это разрешить, нужно поместить имена процедур в специальную секцию exports, например:

exports

BubleSort,

QuickSort;

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

Посмотрим на пример исходного текста простейшей динамически загружаемой библиотеки SortLib (посмотреть приложение).

Пример простейшей динамически загружаемой библиотеки.

library SortLib;

procedure BubleSort(var Arr: array of Integer);

var

I, J, T: Integer;

begin

for I := Low(Arr) to High(Arr) - 1 do

for J := I + 1 to High(Arr) do

if Arr[I] > Arr[J] then

begin

T := Arr[I];

Arr[I] := Arr[J];

Arr[J] := T;

end;

end;

exports

BubleSort; begin end.

Она содержит единственную процедуру BubleSort, сортирующую массив целых чисел методом «пузырька»:

Исходный текст динамически загружаемой библиотеки заканчивается операторным блоком begin...end, в который можно вставить любые операторы для подготовки библиотеки к работе. Эти операторы выполняются во время загрузки библиотеки основной программой. Наша простейшая библиотека SortLib не требует никакой подготовки к работе, поэтому ее операторный блок пустой.

5.2.2. Экспорт подпрограмм

Поговорим подробнее о секциях exports.

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

В стандартном случае экспортное имя подпрограммы считается в точности таким, как ее идентификатор в исходном тексте библиотеки (с учетом заглавных и строчных букв). Например, если секция exports имеет следующий вид,

exports

BubleSort;

то это означает, что экспортное имя процедуры будет ’BubleSort’. При желании это имя можно сделать отличным от программного имени, дополнив описание директивой name, например:

exports

BubleSort name 'BubleSortIntegers';

В итоге, экспортное имя процедуры BubleSort будет ’BubleSortIntegers’.

Экспортные имена подпрограмм должны быть уникальны в пределах библиотеки, поэтому их нужно всегда указывать явно для перегруженных (overload) процедур и функций. Например, если имеются две перегруженные процедуры с общим именем QuickSort,

procedure QuickSort(var Arr: array of Integer); overload; // для целых чисел

procedure QuickSort(var Arr: array of Real); overload; // для вещественных

то при экспорте этим двум процедурам необходимо явно указать отличные друг от друга экспортные имена:

exports

QuickSort(var Arr: array of Integer) name 'QuickSortIntegers';

QuickSort(var Arr: array of Real) name 'QuickSortReals';

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

Еще раз подчеркнем соглашения, используемые при экспорте:

  1. В экспортном имени между заглавными и строчными буквами делается различие.

  2. По умолчанию экспортное имя совпадает с программным именем, но можно сделать экспортное имя другим, дополнив описание директивой name.

  3. Экспортные имена подпрограмм должны быть уникальны в пределах библиотеки.

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