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

При статическом импорте все действия по загрузке и подключению библиотеки выполняются автоматически операционной системой во время запуска главной программы. Чтобы задействовать статический импорт, достаточно просто объявить в программе процедуры и функции библиотеки как внешние. Это делается с помощью директивы external, например:

procedure BubleSortIntegers(var Arr: array of Integer); stdcall;
  external 'SortLib.dll';

procedure QuickSortIntegers(var Arr: array of Integer); stdcall;
  external 'SortLib.dll';

После ключевого слова external записывается имя двоичного файла библиотеки в виде константной строки или константного строкового выражения. Вместе с директивой external может использоваться уже известная вам директива name, которая служит для явного указания экспортного имени процедуры в библиотеке. С ее помощью объявления процедур можно переписать по-другому:

procedure BubleSort(var Arr: array of Integer); stdcall;
  external 'SortLib.dll' name 'BubleSortIntegers';

procedure QuickSort(var Arr: array of Integer); stdcall;
  external 'SortLib.dll' name 'QuickSortIntegers';

Поместив в программу приведенные выше объявления, можно вызывать процедуры BubleSort и QuickSort, как будто они являются частью самой программы. Давайте это проверим.

Шаг 6. Создайте новую консольную программу. Для этого выберите в меню команду File | New | Other... и в открывшемся диалоговом окне выделите значок Console Application. Затем нажмите кнопку OK.

Шаг 7. Добавьте в программу external-объявления процедур BubleSort и QuickSort, а также наберите приведенный ниже текст программы. Сохраните проект под именем TestStaticImport.dpr.

program TestStaticImport;

{$APPTYPE CONSOLE}

procedure BubleSort(var Arr: array of Integer); stdcall;
  external 'SortLib.dll' name 'BubleSortIntegers';
procedure QuickSort(var Arr: array of Integer); stdcall;
  external 'SortLib.dll' name 'QuickSortIntegers';

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);
  for I := Low(Arr) to High(Arr) do
    Write(Arr[I], ' ');
  Writeln;
  // Метод быстрой сортировки
  for I := Low(Arr) to High(Arr) do
    Arr[I] := Random(100); // Заполнение массива случайными числами
  QuickSort(Arr);
  for I := Low(Arr) to High(Arr) do
    Write(Arr[I], ' ');
  Writeln;
  Writeln('Press Enter to exit...');
  Readln;
end.

Шаг 8. Выполните компиляцию и запустите программу. Если числа печатаются на экране по возрастанию, то сортировка работает правильно.

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

 

Яндекс цитирования