Разработка библиотеки
Структура библиотеки
По структуре исходный текст библиотеки похож на исходный текст программы, за исключением того, что текст библиотеки начинается с ключевого слова library, например:
library SortLib;
uses SysUtils, Classes, Forms, Windows;
procedure HelloWorld(AForm : TForm);
Begin
MessageBox(AForm.Handle, 'Hello world!',
'DLL Message Box', MB_OK or MB_ICONEXCLAMATION);
end;
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,
HelloWorld;
Begin
End.
Первое, на что следует обратить внимание, это ключевое слово library, находящееся вверху страницы. Library определяет этот модуль как модуль библиотеки DLL. Далее идет название библиотеки. В нашем примере мы имеем дело с динамической библиотекой, содержащей две процедуры: HelloWorld и BubleSort. Причем данные процедуры по структуре ничем не отличается от тех, которые вы помещаете в модули своих приложений. Процедуры и функции - это главное, что должно быть в динамически загружаемой библиотеке, поскольку лишь они могут быть экспортированы.
Если в теле библиотеки объявлены некоторые процедуры, то это еще не значит, что они автоматически станут доступны для вызова извне. Для того чтобы это разрешить, нужно поместить имена процедур в специальную секцию exports.
Exports
BubleSort,
HelloWorld;
Перечисленные в секции exports процедуры и функции отделяются запятой, а в конце всей секции ставится точка с запятой. Секций exports может быть несколько, и они могут располагаться в программе произвольным образом.
В конце модуля можно увидеть ключевые слова begin и end. Внутри данного блока вы можете поместить код, который должен выполняться в процессе загрузки библиотеки. Достаточно часто этот блок остается пустым.
Описание и реализация процедур и функций, вызываемых в пределах текущей DLL, ничем не отличаются от их аналогов в обычных проектах-приложениях. Их специфика заключается лишь в том, что вызывающая программа не будет иметь к ним доступа. Она просто не будет ничего знать об их существования, так же, как одни классы ничего не знают о тех методах, которые описаны в секции private других классов.