Чтобы модуль мог использовать процедуру или функцию в DLL,
он должен импортировать процедуру или функцию с помощью описания
external. Например, в следующем описании из DLL и именем KERNEL
(ядро Windows) импортируется функция с именем GlobalAlloc:
function GlobalAlloc(Glags: Word; Bytes: Longint): THandle;
far; external 'KERNEL' index 15;
В импортируемой процедуре или функции директива external за-
нимает место описательной и операторной части, которые нужно было
бы включить в противном случае. В импортируемых процедурах и
функциях должна использоваться дальняя модель вызова, выбранная
ключевым словом far или директивой компилятора {$F+}; во всем ос-
тальном их поведение не отличается от обычных процедур и функций.
Borland Pascal импортирует процедуры и функции тремя спосо-
бами:
- по имени;
- по новому имени;
- по порядковому номеру.
Формат директив external для каждого из трех методов показан
в приведенном ниже примере.
Когда оператор index или name не указан, процедура или функ-
ция экспортируются по имени. Это имя совпадает с идентификатором
процедуры или функции. В данном примере процедура ImportByName
импортируется из библиотеки 'TESTLIB' по имени 'IMPORTBYNAME':
procedure ImportByName; external 'TESTLIB';
Когда задан оператор name, процедура или функция импортиру-
ется под именем, отличным от имени идентификатора. В следующем
примере процедура ImportByName импортируется из библиотеки
'TESTLIB' по имени 'REALNAME':
procedure ImportByName; external 'TESTLIB'name 'REALNAME'
Наконец, при наличии оператор index процедура или функция
импортируется по порядковому значению. Такой вид импорта уменьша-
ет время загрузки модуля, так как отпадает необходимость поиска
имени в таблице имен DLL. В следующем примере процедура
ImportByOrd импортируется из библиотеки 'TESTLIB':
procedure ImportByOrd; external 'TESTLIB' index 5;
Имя DLL задается после ключевого слова external, а новое
имя, заданное в операторе name, не обязано представлять собой
строковые литералы. Допускается любое строковое выражение-конс-
танта. Аналогично, порядковый номер, задаваемый в операторе
index, может быть любым целочисленным выражением-константой.
const
TestLib = TestLib;
Ordinal = 5;
procedure ImportByName; external TestLib;
procedure ImportByName; external TestLibname 'REALNAME'
procedure ImportByOrd; external TestLib index Ordinal;
Хотя DLL может содержать переменные, импортировать их в дру-
гие модули невозможно. Любой доступ к переменным DLL должен осу-
ществляться через процедурный интерфейс.