Використання DLL у Delphi

Delphi , Файлова система , DLL та PlugIns

  • Концепція DLL
  • Створення DLL у Delphi (експорт)
  • Використання DLL у Delphi (імпорт)
  • DLL, що використовують об'єкти VCL для роботи з даними
  • Виняткові ситуації у DLL
  • Концепція DLL

Програма1 Програма2 : : MyFunc(:) MyFunc(:) : : код функції MyFunc код функції MyFunc код інших функцій код інших функцій

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

Але чим же відрізняються Dynamic Link Library (DLL) від звичайних додатків? Для розуміння цього потрібно уточнити поняття задачі (task), екземпляра (копії) програми (instance) та модуля (module).

При запуску кількох примірників однієї програми, Windows завантажує в оперативну пам'ять тільки одну копію коду і ресурсів - модуль програми, створюючи кілька окремих сегментів даних, стека та черги повідомлень (див. рис. 3), кожен набір яких являє собою завдання, у розумінні Windows. Копія програми являє собою контекст, в якому виконується модуль програми.

DLL – бібліотека також є модулем. Вона знаходиться в пам'яті в єдиному екземплярі та містить сегмент коду та ресурси, а також сегмент даних (див. рис. 4).

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

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

Часто, як DLL створюються окремі набори функцій, об'єднані за тими чи іншим логічним ознаками, аналогічно тому, як концептуально відбувається планування модулів ( у сенсі unit ) в Pascal. Відмінність полягає в тому, що функції із модулів Pascal компонуються статично - на етапі лінківки, а функції з DLL компонуються динамічно, тобто в run-time.

Створення DLL у Delphi (експорт)

Для програмування DLL Delphi надає ряд ключових слів та правил синтаксису. Головне – DLL у Delphi такий самий проект як і програма.

Розглянемо шаблон DLL:

Ім'я файлу проекту для такого шаблону має бути MYDLL.DPR.

На жаль, у IDE Delphi автоматично генерується лише проект програми, тому Вам доведеться проект DLL готувати вручну. У Delphi 2.0 це незручність усунуто.

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

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

Залежно від цього використовується різний синтаксис:

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

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

Якщо ж Ви експортуватимете функції наступним чином:

Використання DLL у Delphi (імпорт)

Для організації імпорту, тобто. доступу до функцій, експортованих з DLL, як і їх експорту, Delphi надає стандартні кошти.

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

Цей метод називається статичним імпортом.

Як Ви могли помітити, розширення файлу, що містить DLL, не вказується - за промовчанням маються на увазі файли *.DLL та *.EXE. Як тоді бути у випадку, якщо файл має інше розширення (наприклад, як COMPLIB.DCL в Delphi), або якщо потрібно динамічне визначення DLL і імпортованих функцій (наприклад, Ваша програма працює з різними графічними форматами, і для кожного з них існує окрема DLL.)?

Для вирішення таких проблем Ви можете звернутися безпосередньо до API Windows, використовуючи так званий динамічний імпорт:

Якщо не говорити про код, що генерується компілятором (зараз він більш оптимізований), то всі правила синтаксису залишилися ті ж, що і в Borland Pascal 7.0

DLL, що використовують об'єкти VCL для роботи з даними

Виняткові ситуації в DLL

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

Код у програмі:

СтаттяВикористання DLL у Delphi розділу Файлова система DLL і PlugIns може бути корисною для розробників на Delphi та FreePascal.

Коментарі та питання

:: 2012-01-08 07:52:10 :: re:Використання DLL в Delphi

У мене помилка "не знайдено для файлу", все зробив як треба, при компіляції помилок немає, при запуску "не знайдено для файлу", в чому загвостка мб?

:: 2012-05-10 17:48:34 :: re:Використання DLL в Delphi

DLL має бути у папці з exe.