Карта сайтаСсылкиКонтакты

Динамическая загрузка DLL

PDF Печать
Статьи

В этой статье подробно рассмотрена динамическая загрузка DLL, удаление ее из памяти, когда мы закончим с ней работать.

Выгода от динамической загрузки DLL

Есть много причин для использования этого пути использования DLL. Динамически загружая DLL, Вы решаете во время выполнения какую DLL использовать. Это означает, что Вы можете придавать Вашей программе различные функциональные возможности, в зависимости от того, какая DLL присутствует в памяти.

Использование кода

Этот пример будет использовать DLL, которая создана в статье Добавление форм в DLL, эта DLL экспортитует одну функцию и одну процедуру, которые объявлены как:


procedure ShowDllForm; stdcall;

function ShowDllFormModal: integer; stdcall;

Чтобы вызвать их из нашего приложения, мы должны объявить два новых типа, которые соответствуют этим DLL, подобно этому:


 TShowForm = procedure;
  TShowFormModal = function: integer;

Теперь мы должны создать экземпляры этих двух типов, которые мы будем делать в части private нашего главного класса.


ShowForm : TShowForm;

ShowFormModal : TShowFormModal;

Сейчас вызов любой из этих двух функций закончился бы нарушением доступа (Access Violation), так как они не указывают ни на что. Поэтому в следующем шаге мы должны загрузить DLL и сделать два входа в соответствующие функции в DLL, так:


DLLHandle := LoadLibrary('Project1dll.dll');
 if DLLHandle <> 0 then
 begin
   @ShowForm := GetProcAddress(DLLHandle, 'ShowDllForm');
   @ShowFormModal := GetProcAddress(DLLHandle, 
                                   'ShowDllFormModal');
 end;

Все, что мы здесь делаем - загружаем DLL в память (LoadLibrary), затем получаем адреса этих двух функций (GetProcAddress), которые мы будем вызывать. Теперь мы можем вызвать ShowForm и ShowFormModal, как будто это стандартные процедуры.

Очистка

Когда мы закончили использовать DLL, мы должны удалить ее из памяти:


FreeLibrary(DLLHandle);

Когда DLL будет выгружена, Вы должны удостовериться, что не будете вызывать любую из этих функций, иначе будет ошибка Access Violation!

Заключение

Как можно заметить в этом примере, динамеческая загрузка DLL довольно проста.


 

Добавить комментарий


Защитный код
Обновить