Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод2курс_прогр_конт.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.38 Mб
Скачать
  1. Использование dll-библиотек.

Для того чтобы в прикладной программе воспользоваться процедурами и функциями библиотеки, необходимо выполнить так называемый импорт. Импорт обеспечивает загрузку библиотеки в оперативную память и привязку записанных в программе команд вызова к адресам соответствующих процедур и функций библиотеки.

Существуют два способа импорта, отличающихся по удобству и гибкости программирования:

  • статический импорт (обеспечивается директивой компилятора external);

  • динамический импорт (обеспечивается функциями  LoadLibrary и GetProcAddress).

Статический импорт является более удобным, а динамический — более гибким.

При статическом импорте все действия по загрузке и подключению библиотеки выполняются автоматически операционной системой во время запуска главной программы. Чтобы задействовать статический импорт, достаточно просто объявить в программе процедуры и функции библиотеки как внешние. Это делается с помощью директивы 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, как будто они являются частью самой программы.

Этот способ называется статическим импортом.

Расширение файла, содержащего DLL, может не указываться - по умолчанию подразумеваются файлы *.DLL и *.EXE. Если файл имеет другое расширение (например, как COMPLIB.DCL в Delphi), или если требуется динамическое определение DLL и импортируемых функций (например, Ваша программа работает с различными графическими форматами, и для каждого из них существует отдельная DLL.), то для решения такого рода проблем можно обратиться напрямую к API Windows, используя, так называемый, динамический импорт:

 

uses

WinTypes, WinProcs, ... ;

type

TMyProc = procedure ;

var

Handle : THandle;

MyImportProc : TMyProc;

begin

Handle:=LoadLibrary('MYDLL');

if Handle>=32 then { if <=32 - error ! }

begin

@MyImportProc:=GetProcAddress(Handle,'MYEXPORTPROC');

if MyImportProc<>nil then

...... {using imported procedure}

end;

 

FreeLibrary(Handle);

end;

Лекция № 22. Понятие исключительной ситуации. Обработка исключений.