Библиотеки dll

Библиотеки dll

Библиотеки dll (dynamically linked libraries):

Они находятся в файле с расширением .dll либо в текущем каталоге приложения (локальные), либо в системном каталоге (глобальные библиотеки). Глобальными библиотеками могут пользоваться одновременно несколько приложений.

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

Отличия библиотек от модулей

  1. При создании из модулей исполняемого файла .exe программа-линковщик помещает в него только те подпрограммы, переменные, типы и константы, которые используются (вызываются) в основной программе. При компиляции же библиотеки в нее добавляются все подпрограммы, потому что неизвестно, какие подпрограммы потребуются конкретному приложению.
  2. Библиотеки .dll при выполнении программы полностью загружаются в оперативную память.
  3. Библиотеки .dll часто используются одновременно несколькими программами.
  4. Библиотека .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.