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,