Створення і використання DLL в Delphi

  1. створення DLL
  2. синтаксис DLL
  3. Видимість функцій і процедур
  4. локальні
  5. експортуються
  6. Завантаження DLL
  7. статична завантаження
  8. динамічне завантаження
  9. Оголошення типу, що описує функцію
  10. Завантаження бібліотеки
  11. Отримуємо покажчик на функцію
  12. Виклик функції
  13. Вивантаження бібліотеки з пам'яті
  14. експорт рядків
  15. приклад DLL
  16. Приклад виклику функції з DLL

Використання DLL (динамічно підключається) широко поширене в програмуванні Windows. DLL насправді частина коду виконуваного файлу з розширенням DLL. Будь-яка програма може викликати DLL. Використання DLL (динамічно підключається) широко поширене в програмуванні Windows

Перевага 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.

Дополнительная информация

rss
Карта