Створення і використання dll в delphi (прив'язка dll до програми, динамічне завантаження)

DLL-бібліотека дозволяє об'єднати в одне ціле повторно використовуваний код. Функції з DLL - бібліотеки можуть підключатися динамічно під час виконання, на відміну від функцій з пакетів Delphi, лінкуемих статично на етапі компіляції програми.

Для того щоб створити DLL-бібліотеку, для початок необхідно виконати команду меню File | New | Other і вибрати на сторінці New діалогу New Item елемент DLL Wizard.

Майстер DLL Wizard автоматично створить порожній шаблон для DLL-бібліотеки. На відміну від звичайного модуля, який починається з ключового слова unit, модуль DLL-бібліотеки починається з ключового слова library. Секція uses модуля DLL-бібліотеки вимагає підключення тільки двох пакетів: SysUtils і Classes.

Створення DLL-функції складається з декількох етапів:

1. Спочатку в секції реалізації модуля слід ввести сигнатуру функції і запрограмувати код, що виконується функцією.

2. Далі в сигнатурі функції треба визначити, яким чином буде відбуватися виклик параметрів.

3. На закінчення функцію, яку передбачається використовувати не тільки всередині модуля, а й викликати з інших додатків, слід оголосити як експортовану в секції exports.

Функції з DLL-бібліотеки можуть викликатися як з додатків, розроблених в Delphi, так і з додатків, написаних на інших мовах програмування, таких, як C ++.

Спосіб передачі параметрів вказується через крапку з комою після опису функції. наприклад:

function F1 (X, Y, Z: Real]: Real; stdcall ;.

Різні способи передачі параметрів визначають порядок передачі параметрів (зліва направо або справа наліво), а також вказують, хто буде звільняти пам'ять стека (викликається або викликає процедура). При використанні DLL-бібліотек в якості компонентів, що викликаються з додатків на інших мовах програмування, слід використовувати відповідний модифікатор виклику. Для додатків на C ++ застосовується модифікатор виклику stdcall.

Для того щоб функцію, описану в DLL-бібліотеці, можна було викликати з іншої програми, цю функцію слід експортувати. Список всіх експортованих функцій вказується в секції exports через кому

і завершується символом крапка з комою. Експорт функцій може виконуватися трьома способами:

• на ім'я функції, що використовується в DLL-бібліотеці;

• на ім'я функції, заданому як ім'я експорту;

• по наданим функції індексу.

Для того щоб привласнити функції деякий індекс, його слід вказати в секції exports після імені функції з ключовим словом index.

Для того щоб продукція, що експортується функція викликалася на ім'я, відмінному від імені, що використовується в DLL-бібліотеці, в секції exports після імені функції слід вказати ключове слово name і нове ім'я експорту для даної функції.

DLL - бібліотека не є виконуваним модулем. Для отримання її коду досить зробити компіляцію проекту.

function F1 (X, Y: Integer): Integer; stdcall;

Статична підключення DLL-бібліотеки

DLL-бібліотека може підключатися або статично, або динамічно. При підключенні DLL-бібліотеки вона завантажується в пам'ять програми.

При статичному підключенні DLL-бібліотека завантажується один раз при запуску програми. На всьому протязі виконання програми ім'я функції, що імпортується з DLL-бібліотеки, яка була підключена статично, вказує на одну і ту ж функцію (точку входу в DLL) в одній і тій же DLL. Всі функції з DLL-бібліотеки, які будуть використовуватися в додатку спочатку, повинні бути оголошені як зовнішні. При цьому слід вказати, якщо потрібно, модифікатор виклику. Якщо функція викликається за індексом, то для неї слід задати ім'я, яке використовується в додатку, і індекс функції в DLL-бібліотеці.

Windows, Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls;

Editl: TEdit; [Поле для введення першого значення>

Edit2: TEdit; (Поле для введення другого значення>

Edit3: TEdit; (Поле для відображення результату

виконання функції з DLL-бібліотеки>

Buttonl: TButton;

Button2: TButton; [Виконується виклик функції, використовуваної за індексом>

procedure ButtonlClickfSender: TObject);

procedure Button2Click (Sender: TObject);

procedure TForml.Button2Click (Sender: TObject);

Динамічне підключення DLL-бібліотеки

На відміну від статичного підключення DLL-бібліотеки, що виконується в момент завантаження програми, динамічне підключення DLL-бібліотеки може бути виконано в будь-якій точці виконання програми. Після виклику функції з DLL-бібліотеки її можна відключити. При одночасному використанні декількох DLL-бібліотек це дає відчутну економію пам'яті. Для динамічного підключення DLL-бібліотеки використовуються функції Windows API. Windows API - це набір стандартних функцій, який використовується для реалізації взаємодії з операційною системою.

При виконанні функції з динамічно підключається DLL-бібліотеки замість визначення імені функції як external в разі статичного зв'язування слід визначити новий тип, який відповідає типу викликається функції, і створити змінну даного типу.

Для того щоб здійснити телефонний дзвінок функції з динамічно підключається DLL-бібліотеки, виконайте наступні дії:

1. Створіть новий тип. відповідний типу викликається функції (ім'я нового типу можна ввести після секції type).

TMyFl = function (i, j: Integer): Integer; stdcall;

2. У секції var interface-секції модуля створіть змінну створеного типу функції. Наприклад: MyFl. TMyFl;

3. Перед завантаженням DLL-бібліотеки оголосіть змінну типу Integer, яка буде містити дескриптор підключається бібліотеки.

4. Викличте метод LoadLibrary, що виконує підключення DLL-бібліотеки. наприклад; h: = LoadLibrary ( 'Projectl.dll');

5. Перевірте, чи успішно виконано підключення бібліотеки. Якщо ім'я DLL-бібліотеки зазначено невірно або бібліотека не знайдена, то функція LoadLibrary поверне значення 0.

8. На цьому етапі можна виконувати виклик функції з динамічно підключеної DLL-бібліотеки.

9. Для звільнення і відповідно вивантаження DLL-бібліотеки викличте метод FreeLibrary, що виконує відключення DLL-бібліотеки.

Windows, Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls;

Використання DLL-бібліотеки для виклику загальних модальних діалогів.

Результатом виконання процедури з DLL-бібліотеки може бути відображення деякого модального діалогу. Для цього слід в експортується методі створити об'єкт форма, відобразити її як модальний діалог, а потім видалити об'єкт форма. При цьому в самій формі слід передбачити виклик методу Close для завершення діалогу.

Для створення форми використовується метод Create, як параметр якому передається покажчик на батьківську форму - форму викликає додатки. Цей параметр передається викликається DLL-функції.

Нижче наведено приклад DLL-бібліотеки, що містить функцію, яка використовується для відображення модальної форми і повернення введеного в неї значення.

Unitl_DLL in 'Unitl_DLL.pas';

procedure MyModalForm (var Z: Integer; F: TForm1); stdcall;

(Параметр F передається при виклику процедури і містить покажчик

на батьківську форму - форму викликає додатки>

(Перший параметр використовується для значення, що повертається>

Для того щоб використовувати дану DLL-бібліотеку з метою виклику створеного модального діалогу, можна застосовувати як динамічне, так і статичну зв'язування. Наступний приклад ілюструє виклик функції з

DLL-бібліотеки, що відображає модальний діалог.

Windows, Messages, SysUtils, Variants, Classes, Graphics,

Схожі статті