- створення DLL
- синтаксис DLL
- Видимість функцій і процедур
- локальні
- експортуються
- Завантаження DLL
- статична завантаження
- динамічне завантаження
- Оголошення типу, що описує функцію
- Завантаження бібліотеки
- Отримуємо покажчик на функцію
- Виклик функції
- Вивантаження бібліотеки з пам'яті
- експорт рядків
- приклад DLL
- Приклад виклику функції з DLL
Використання DLL (динамічно підключається) широко поширене в програмуванні Windows. DLL насправді частина коду виконуваного файлу з розширенням DLL. Будь-яка програма може викликати DLL.
Перевага DLL полягає в наступному:
- Повторне використання коду.
- Спільне використання коду додатками.
- Поділ коду.
- Поліпшення споживання ресурсів в Windows.
створення DLL
У меню File виберіть пункт New -> Other. У діалоговому вікні на вкладці New виберіть DLL Wizard. Автоматично буде створений модуль - порожній шаблон майбутньої DLL.
синтаксис DLL
library Example_dll; uses SysUtils, Classes; var {Оголошуємо змінні} k1: integer; k2: integer; {Оголошуємо функцію} function SummaTotal (factor: integer): integer; register; begin factor: = factor * k1 + factor; factor: = factor * k2 + factor; result: = factor; end; {Експортуємо функцію для подальшого використання програмою} exports SummaTotal; {Ініціалізація змінних} begin k1: = 2; k2: = 5; end.
Для того, щоб побудувати DLL, виберіть Project -> Build Імя_проекта.
Видимість функцій і процедур
Функції та процедури можуть бути локальними і такими, що експортуються з DLL.
локальні
Локальні функції і процедури можуть бути використані всередині DLL. Вони видно тільки всередині бібліотеки і жодна програма не може їх викликати ззовні.
експортуються
Експортовані функції і процедури можуть бути використані за межами DLL. Інші програми можуть викликати такі функції і процедури.
Вихідний код вище використовує електроенергію, що експортується функцію. Ім'я функції слід за зарезервованим словом Exports.
Завантаження DLL
У Delphi є два види завантаження DLL:
- статична завантаження
- динамічне завантаження
статична завантаження
При запуску програми завантажується автоматично. Вона залишається в пам'яті протягом виконання програми. Дуже просто використовувати. Просто додайте слово external після оголошення функції або процедури.
function SummaTotal (factor: integer): integer; register; external 'Example.dll';
Якщо DLL не буде знайдений, програма буде продовжувати працювати.
динамічне завантаження
DLL завантажується в пам'ять в міру необхідності. Її реалізація більш складна, тому що Ви самі повинні завантажувати і вивантажувати її з пам'яті. Пам'ять використовується більш економно, тому додаток працює швидше. Програміст сам повинен стежити, щоб все працювало правильно. Для цього потрібно:
- Оголосити тип описуваної функції або процедури.
- Завантажити бібліотеку в пам'ять.
- Отримати адресу функції або процедури в пам'яті.
- Викликати функцію або процедуру.
- Вивантажити бібліотеку з пам'яті.
Оголошення типу, що описує функцію
type TSumaTotal = function (factor: integer): integer;
Завантаження бібліотеки
dll_instance: = LoadLibrary ( 'Example_dll.dll');
Отримуємо покажчик на функцію
@SummaTotal: = GetProcAddress (dll_instance, 'SummaTotal');
Виклик функції
Label1.Caption: = IntToStr (SummaTotal (5));
Вивантаження бібліотеки з пам'яті
FreeLibrary (dll_instance);
Динамічний виклик DLL вимагає більше роботи, але легше управляти ресурсами в пам'яті. Якщо Ви повинні використовувати DLL в межах програми, тоді краще статична завантаження. Не забувайте використовувати блок try ... except і try ... finally, щоб уникнути помилок під час виконання програми.
експорт рядків
Створена DLL з використанням Delphi, може бути використана і в програмах, написаних на інших мовах програмування. З цієї причини ми не можемо використовувати будь-який тип даних. Типи, які існують в Delphi можуть бути відсутні в інших мовах. Бажано використовувати власних типи даних з Linux або Windows. Наша DLL може бути використана іншими програмістом, який використовує іншу мову програмування.
Можна використовувати такі рядки і динамічні масиви в DLL, написаної в Delphi, але для цього потрібно підключити модуль ShareMem в розділ uses в DLL і програмою, яка буде її використовувати. Крім того, це оголошення має бути першим у розділі uses кожного файлу проекту.
Типів string, як ми знаємо, С, С ++ та інших мовах не існує, тому бажано використовувати замість них PChar.
приклад DLL
library Example_dll; uses SysUtils, Classes; var {Оголошуємо змінні} k1: integer; k2: integer; {Оголошуємо функцію} function SummaTotal (factor: integer): integer; register; begin factor: = factor * k1 + factor; factor: = factor * k2 + factor; result: = factor; end; {Експортуємо функцію для подальшого використання програмою} exports SummaTotal; {Ініціалізація змінних} begin k1: = 2; k2: = 5; end.
Приклад виклику функції з DLL
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class (TForm) Button1: TButton; procedure Button1Click (Sender: TObject); private {Private declarations} public {Public declarations} end; type TSummaTotal = function (factor: integer): integer; var Form1: TForm1; implementation {$ R * .dfm} procedure TForm1.Button1Click (Sender: TObject); var dll_instance: Thandle; SummaTotal: TSummaTotal; begin dll_instance: = LoadLibrary ( 'Example_dll.dll'); @SummaTotal: = GetProcAddress (dll_instance, 'SummaTotal'); Label1.Caption: = IntToStr (SummaTotal (5)); FreeLibrary (dll_instance); end; end.