Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Статическая и динамическая загрузка DLL




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

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

function Add1(К: Integer): Integer: stdcall;

external 'FirstLib.dll' name 'CalculateSum';

 

function Add1(К: Integer): Integer; stdcall;

external 'FirstLib.dll' index 1;

Для тестирования необходимо описать в приложении внешнюю функцию одним из вышеупомянутых способов и создать, например, обработчик события OnClick кнопки, помещенной на форму вместе с компонентом TEdit:

procedure TForm1.Button1Click(Sender:TObject);

var

N: Integer;

begin

N:= StrToInt(Edit1.Text);

N:= Add1(N);

Edit1.Text:= IntToStr(N);

end;

При щелчке на кнопке будет вызываться функция из DLL. Обратите внимание на изменение имени функции: из обработчика события OnClick вызывается функция с именем Add1. Эта функция экспонируется в DLL под именем CalculateSum. В реализации DLL она имеет название AddOne.

При таком определении функции библиотека будет загружена немедленно после старта приложения и выгружена вместе с его завершением.

При поиске DLL для загрузки первоначально определяется, была ли данная библиотека уже загружена в память другим модулем. Если была — извлекается адрес вызываемой функции и затем передается приложению. Если же нет — операционная система начинает ее поиск на диске. При этом если в имени DLL путь не указан в явном виде, то операционная система ищет библиотеку в каталоге модуля, пытающегося загрузить DLL. Если не находит — то продолжает поиск в каталогах WINDOWS и WINDOWS\SYSTEM (или WINNT, WINNT\SYSTEM, WINN T\SYSTEM32). После этого происходит поиск в каталогах, определенных в переменной среды Path. Если операционная система обнаруживает библиотеку с заданным именем, она загружает эту библиотеку и приложение стартует. Если же нет — возникает исключение и приложение прекращает свою работу. Приложение также прекращает свою работу, если не найдена функция с данным именем (или индексом, если она импортируется по индексу).

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




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


Дата добавления: 2014-01-05; Просмотров: 602; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.