Бібліотеки DLL
DLL (з англійської Dynamic Link Library — «бібліотека динамічного компонування», «клієнтська бібліотека») в Microsoft Windows і IBM OS/2 — динамічна бібліотека, яка дає можливість багаторазово використовувати різні програмні додатки. До DLL також належать керуючі елементи ActiveX та драйвери. В системах UNIX такі самі функції виконуються загальними об’єктами (з англійської Shared Object). DLL як формат файлів дотримується таких самих угод, що і формат файлів, які виконуються, поєднуючи код, ресурси і таблиці.
Спершу передбачалося, що поява бібліотек DLL буде надавати можливість правильної організації пам\’яті та дискового простору за умови використання лише одного екземпляра модуля бібліотек для різних додатків. Для ранніх версій Windows з дуже жорстким обмеженням пам’яті, це було особливо важливо. Згодом передбачалось поліпшення ефективності розробки і ефективне використання засобів системи через модульність. Заміна версії програми DLL з однієї на другу повинна була надати можливість, не чіпаючи інших додатків, незалежно збільшувати систему. Окрім цього, динамічні бібліотеки могли використовуватися різнотипними програмами, такими як – Microsoft Office, Microsoft Visual Studio та іншими.Великих переваг від впровадження бібліотек, що динамічно підключаються, отримати не вдалося. Це сталося через виникнення такого явища як DLL HELL (з. англійської «DLL-пекло»). Пекло DLL виникає в тому разі, якщо декілька різних додатків вимагають підключення одночасно різних, і не повністю сумісних версій бібліотек, що зазвичай призводить до помилок в цих додатках і до конфліктів типу DLL HELL, при цьому знижується загальна надійність операційних систем. Пізніше, нові версії Microsoft, надали можливість підтримки паралельного використання різних версій DLL, що знищило переваги початкового принципу модульності.
Виклик функції з DLL
DLL можна завантажувати двома способами: з явним і неявним компонуванням.
За неявного компонування, функції DLL, що завантажили, додаються в секцію імпорту вхідного файлу. Під час запуску таких файлів всі зазначені бібліотеки підключаються завантажувачем операційної системи. Також, операційною системою проводиться аналіз секцій імпорту. Такий спосіб дуже популярний, через простоту використання. Але, з іншого боку, неявному компонуванню притаманні деякі недоліки та обмеження:
– Завжди йде завантаження всіх підключених DLL, навіть якщо під час своєї роботи, програма не має потреби в зверненні до жодної з них.
– За відсутності хоча б однієї з необхідних dll, або якщо одна з необхідних функцій не експортована – завантаження файлу буде перервано, навіть якщо ця бібліотека не обов’язкова для роботи програми. Наприклад, для текстового редактора, для цілковитої роботи, вистачило би і мінімальної комплектації – не використовуючи модуль друку, виведення таблиць, формули, графіки та інші другорядні компоненти, але за неявного компонування цих dll все одно доведеться завантажувати собі все.
– Здійснення пошуку dll виконується у такому порядку: в каталозі, який містить викликаний файл у поточному каталозі процесу; в системному каталозі %Windows%System%; в основному каталозі %Windows%; в каталогах, вказаних у змінній PATH. Задання іншого шляху пошуку неможливе (вірніше – можливе, але це потребує внесення змін до реєстру, і ці зміни будуть впливати на всі процеси, що виконуються в системі).
Явне компонування позбавлене цих недоліків ціною ускладнення коду. Програміст повинен сам піклуватися про завантаження бібліотек DLL і про підключення експортованих функцій (при цьому пам’ятаючи про контроль над помилками, інакше справа може закінчитися зависанням системи). Проте явне компонування дає можливість довантажувати DLL по мірі необхідності і дозволяє програмісту самостійне опрацьовування ситуації за відсутності DLL. Також можна не задавати ім’я DLL в програмі явно, а сканувати деякий каталог на наявність динамічних бібліотек і підключати всі знайдені до додатку.