Импорт из DLL может проводиться по имени процедуры (функции), порядковому номеру или с присвоением другого имени.
При статическом импорте все действия по загрузке и подключению библиотеки выполняются автоматически операционной системой во время запуска главной программы. Чтобы задействовать статический импорт, достаточно просто объявить в программе процедуры и функции библиотеки как внешние. Это делается с помощью директивы external, например:
// вызов по имени
procedure BubleSortIntegers (var Arr: array of Integer); stdcall;
external 'SortLib.dll';
procedure QuickSort(var Arr: array of Integer); stdcall;
external 'SortLib.dll';
procedure HelloWorld(AForm: TForm); stdcall;
external 'SortLib.dll';
После ключевого слова external записывается имя двоичного файла библиотеки в виде константной строки или константного строкового выражения.
Если вы хотите изменить имя импортируемой функции (процедуры), то можно использовать директиву name, которая служит для явного указания экспортного имени процедуры в библиотеке. С ее помощью объявления процедур можно переписать по-другому:
// присвоением другого имени внешней процедуре
procedure QuickSort(var Arr: array of Integer); stdcall;
external 'SortLib.dll' name 'QuickSortIntegers';
Импорт по порядковому номеру требует от вас указание этого самого номера:
procedure SayHelloWorld(AForm: TForm);
external 'myfirstdll.dll' index 15;
В этом случае имя, которое вы даете процедуре при импорте не обязательно должно совпадать с тем, которое было указано для нее в самой DLL. Т.е. приведенная выше запись означает, что вы импортируете из динамической библиотеки myfirstdll.dll процедуру, которая в ней экспортировалась пятнадцатой, и при этом в рамках вашего приложения этой процедуре дается имя SayHelloWorld.
Поместив в программу приведенные выше объявления, можно вызывать процедуры BubleSort, QuickSort и HelloWorld, как будто они являются частью самой программы.
…
Var Arr: array [0..9] of Integer;
I: Integer;
Begin
Randomize;
// Заполнение массива случайными числами
for I:= Low(Arr) to High(Arr) do Arr[I]:= Random(100);
// сортировка
BubleSort(Arr);
// вызов процедуры HelloWorld
HelloWorld(self);
…
End.
Примечание. Компиляция программы не требует наличия компилированной библиотеки, а это значит, что их разработка может осуществляться совершенно независимо, причем разными людьми. Нужно лишь договориться о типах и списках параметров, передаваемых в процедуры и функции, а также выбрать единое соглашение о вызове.