Виклик функцій з DLL

Існує три способи завантаження DLL:

а) неявна

б) явна

в) відкладена

Розглянемо неявну завантаження DLL Для побудови програми, розрахованого на неявну завантаження DLL, необхідно мати:

• Бібліотечний що включається файл з описами використовуваних обєктів з DLL (прототипи функцій, оголошення класів і типів) Цей файл використовується компілятором

• LIB-файл зі списком імпортованих ідентифікаторів Цей файл потрібно додати в налаштування проекту (у список бібліотек, використовуваних компоновщиком)

Компіляція проекту здійснюється звичайним чином Використовуючи обєктні модулі і LIB файл, а також враховуючи посилання на імпортовані ідентифікатори, компонувальник (линкер, редактор звязків) формує завантажувальний ЕХЕ модуль У цьому модулі компонувальник поміщає також розділ імпорту, де перераховуються імена всіх необхідних DLL-модулів Для кожної DLL в розділі імпорту вказується, на які імена функцій і змінних зустрічаються посилання в коді виконуваного файлу Ці відомості буде використовувати завантажувач операційної системи

Що ж відбувається на етапі виконання клієнтського додатка Після запуску ЕХЕ-модуля завантажувач операційної системи виконує такі операції:

1&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Створює віртуальний адресний простір для нового процесу і проектує на нього виконуваний модуль

2&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Аналізує розділ імпорту, визначаючи всі необхідні DLL-модулі і теж проектуючи їх на адресний простір процесу

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

Після відображення ЕХЕ-модуля і всіх DLL-модулів на адресний простір процесу його первинний потік готовий до виконання, і додаток починає роботу

Недоліками неявній завантаження є обовязкова завантаження бібліотеки, навіть якщо звернення до її функцій не відбуватиметься, і, відповідно, обовязкова вимога до наявності бібліотеки при компонуванні

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

У разі явної завантаження процес роботи з DLL відбувається в три етапи:

1&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Завантаження DLL за допомогою функції LoadLibrary (Або її розширеного аналога LoadLibraryEx) У разі успішного завантаження функція повертає дескриптор hLib типу HMODULE, що дозволяє надалі звертатися до цієї DLL

2&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Виклики функції GetProcAddress для отримання покажчиків на необхідні функції або інші обєкти В якості першого параметра функція GetProcAddress отримує дескриптор hLib, як другий параметр-адреса рядка з імям імпортованої функції Далі отриманий покажчик використовується клієнтом Наприклад, якщо це покажчик на функцію, то здійснюється виклик потрібної функції

3&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Коли завантажена динамічна бібліотека більше не потрібна, рекомендується її звільнити, викликавши функцію FreeLibrary Звільнення бібліотеки не означає, що операційна система негайно видалить її з памяті Затримка вивантаження передбачена на той випадок, коли ця ж DLL через деякий час знову знадобиться якомусь процесу Але якщо виникнуть проблеми з оперативною памяттю, Windows в першу чергу видаляє з памяті звільнені бібліотеки

Розглянемо відкладену завантаження DLL DLL відкладеного завантаження (delay-load DLL) це неявно яку повязують DLL, яка не завантажується до тих пір, поки код не вернувся до якого-небудь експортованого з неї ідентифікатором Такі DLL можуть бути корисні в таких ситуаціях:

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

• Якщо додаток призначений для роботи в різних версіях ОС, то частину функцій може зявитися лише в пізніх версіях ОС і не використовуватися в поточній версії Але якщо програма не викликає конкретної функції, то DLL їй не потрібна, і вона може спокійно продовжувати роботу При зверненні ж до неіснуючої

функції можна передбачити видачу користувачеві відповідного попередження

Для реалізації методу відкладеного завантаження потрібно додатково в список бібліотек компоновщика додати не тільки потрібну бібліотеку імпорту MyLiblib, але ще і системну бібліотеку імпорту delayimplib Крім цього, потрібно додати в опціях компоновщика прапор / delayload: MyLibdll

Перераховані налаштування змушують компонувальник виконати наступні операції:

• впровадити в ЕХЕ-модуль спеціальну функцію
delayLoadHelper

• видалити MyLibdll з розділу імпорту виконуваного модуля, щоб завантажувач операційної системи не намагався виконати неявну завантаження цієї бібліотеки на етапі завантаження програми

• Додати в ЕХЕ-файл новий розділ відкладеного імпорту зі списком функцій, що імпортуються з MyLibdll

• перетворити виклики функцій з DLL до викликів
delayLoadhelper

На етапі виконання додатку виклик функції з DLL реалізується зверненням до delayLoadHelper Ця функція, використовуючи інформацію з розділу відкладеного імпорту, викликає спочатку LoadLibrary, а потім GetprocAddress Отримавши адресу DLL-функції, delayLoadHelper робить так, щоб надалі ця DLL-функція викликалася безпосередньо Відзначимо, що кожна функція в DLL настроюється індивідуально при першому її виклику

Джерело: Сучкова, ЛІ Win32 API: основи програмування: навчальний посібник / ЛІ Сучкова АлтГТУ ім ШІ Ползунова -Барнаул, АлтГТУ, 2010 138 с, іл

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*