Статический импорт

Импорт из 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.

Примечание. Компиляция программы не требует наличия компилированной библиотеки, а это значит, что их разработка может осуществляться совершенно независимо, причем разными людьми. Нужно лишь договориться о типах и списках параметров, передаваемых в процедуры и функции, а также выбрать единое соглашение о вызове.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: