Библиотеки dll
Библиотеки dll
Библиотеки dll (dynamically linked libraries):
* содержат группу взаимосвязанных подпрограмм
* находятся в откомпилированном файле
* предназначены для обращения к ним из различных программ
Они находятся в файле с расширением .dll либо в текущем каталоге приложения (локальные), либо в системном каталоге (глобальные библиотеки). Глобальными библиотеками могут пользоваться одновременно несколько приложений.
По своему назначению библиотеки очень похожи на модули, однако, имеют ряд важных отличий.
Отличия библиотек от модулей
* При создании из модулей исполняемого файла .exe программа-линковщик помещает в него только те подпрограммы, переменные, типы и константы, которые используются (вызываются) в основной программе. При компиляции же библиотеки в нее добавляются все подпрограммы, потому что неизвестно, какие подпрограммы потребуются конкретному приложению.
* Библиотеки .dll при выполнении программы полностью загружаются в оперативную память.
* Библиотеки .dll часто используются одновременно несколькими программами.
* Библиотека .dll может быть написана и откомпилирована на одном языке, а обращаться к ней можно из программ, написанных на других языках. Например, программа на PascalABC.NET может вызывать функцию из библиотеки, созданной на языке C# и наобороот. Таким образом, библиотеки обеспечивают межъязыковое взаимодействие.
Структура библиотеки
Библиотека имеет практически ту же структуру, что и модуль:
library имя библиотеки;
interface
раздел интерфейса
implementation
раздел реализации
end.
Имя библиотеки должно совпадать с именем pas-файла, в котором библиотека находится.
Имеется также упрощенный синтаксис библиотек - без разделов интерфейса и реализации, совпадающий с упрощенным синтаксисом модулей (за исключением заголовка).
В результате компиляции библиотеки в текущем каталоге создаётся .dll-файл, содержащий откомпилированную библиотеку.
Подключение библиотеки к основной программе
Для подключения библиотеки к основной программе используется директива компилятора {$reference ИмяБиблиотеки}. Например:
{$reference ABC.dll}
{$reference ABC1.dll}
begin
writeln(a.GetType);
end.
Подключение библиотеки может проводиться в любом месте исходного файла.
Библиотеки ABC и ABC1 имеют соответственно вид:
library ABC;
var a: integer;
end.
и
library ABC1;
var a: real;
end.
Алгоритм поиска имен в библиотеках
В первую очередь имя ищется в исходном модуле, затем в модулях, подключенных в разделе uses в порядке справа налево, и только потом - в подключенных библиотеках в порядке подключения.
Согласно этому правилу в примере из предыдущего пункта переменная a будет иметь тип integer.
В случае коллизии имен используемое имя можно предварять именем библиотеки с последующей точкой:
{$reference ABC.dll}
{$reference ABC1.dll}
begin
writeln(ABC1.a.GetType);
end.