Использование библиотеки в программе

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

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

· статический импорт (обеспечивается директивой компилятора 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;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.