Использование библиотеки в программе
Для того чтобы в прикладной программе воспользоваться процедурами и функциями библиотеки, необходимо выполнить так называемый импорт.
Импортобеспечивает загрузку библиотеки в оперативную память и привязку записанных в программе команд вызова к адресам соответствующих процедур и функций библиотеки. Существуют два способа импорта, отличающихся по удобству и гибкости программирования:
· статический импорт (обеспечивается директивой компилятора 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, как будто они являются частью самой программы.
Таким образом, компиляция программы не требует наличия компилированной библиотеки, а это значит, что их разработка может осуществляться совершенно независимо, причем разными людьми. Нужно лишь договориться о типах и списках параметров, передаваемых в процедуры и функции, а также выбрать единое соглашение о вызове.
Модуль импорта
При разработке динамически загружаемых библиотек нужно всегда думать об их удобном использовании. Давайте, например, обратимся к последнему примеру и представим, что в библиотеке не две процедуры, а сотня, и нужны они не в одной программе, а в нескольких. В этом случае намного удобнее вынести external-объявления процедур в отдельный модуль, подключаемый ко всем программам в секции uses. Такой модуль условно называют модулем импорта. Кроме объявлений внешних подпрограмм он обычно содержит определения типов данных и констант, которыми эти подпрограммы оперируют.
Модуль импорта для библиотеки SortLib будет выглядеть так (приложение № ):
unit SortLib; interface procedure BubleSort(var Arr: array of Integer); stdcall;procedure QuickSort(var Arr: array of Integer); stdcall; implementation const DllName = 'SortLib.dll'; procedure BubleSort(var Arr: array of Integer); external DllName name 'BubleSortIntegers';procedure QuickSort(var Arr: array of Integer); external DllName name 'QuickSortIntegers'; end. |
Выполняемый файл библиотеки должен всегда сопровождаться модулем импорта, чтобы другие разработчики могли разобраться с параметрами подпрограмм и правильно воспользоваться библиотекой.
Дата добавления: 2016-02-09; просмотров: 823;