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

Створення DLL

Розглянемо формування DLL бібліотеки для Visual Studio 2008, для інших середовищ бібліотеки створюються подібно.

Для створення DLL в середовищі використовується проект типу DLL (File®New®Projects®Win32). Після завдання імені проекту обирається тип DLL і, поки що, обираємо пусту DLL (An empty DLL project). Додамо до проекту необхідні файли з визначення функцій. Додамо файл з заголовками експортованих функцій. Ці функції повинні в заголовку мати __declspec (dllexport).

Трансляція та компоновка DLL виконується як і для проектів інших типів.

В результаті виконання буде створено один або 2 файли: файл *.dll і, *.lib, якщо є хоч одна експортована функція. Імена файлі по замовченню співпадають з іменем проекту. Ці імена можна замінити. Файл *.lib вміщує довідник функцій, а саме ім’я відповідної DLL та таблицю функцій. для кожної функції задається її ім’я, номер, та адреса відносно початку DLL. Раніше номер використовувався для виклику відповідної функції, сьогодні для виклику функцій використовується тільки її ім’я.

Згадайте режими використання DLL:

- завантаження DLL під час завантаження додатка, який використовує DLL (якщо попередні додатки не завантажили цю DLL). Вивантаження після завершення цього додатку (якщо другі додатки не використовують цю DLL);

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

Для першого режиму використання необхідно підключити до проекту, який використовує функції з DLL, файл з розширенням lib, який сформовано при виконанні 2.2.4. В заголовках функцій з DLL необхідно вказати __declspec (dllimport). Далі функції викликаються як для статичної бібліотеки.

Переваги першого режиму.

1. Якщо немає необхідної DLL, програма не буде завантажена.

2. Використання по складності однаково з використанням статичних бібліотек.

Недоліки першого режиму:

1. Файл з розширенням lib є платформенно залежним, тобто Visual Studio, C++ Builder використовують різні файли.

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

3. Не може використовуватися для DLL, які вміщують тільки ресурси і не вміщують експортованих функцій.

Для другого режиму використання необхідно виконати такі кроки.

1. Підключити файл заголовків Windows.h

2. Перед використанням першої функції з DLL завантажити цю DLL. Для цього використовується функція LoadLibrary.

HMODULE WINAPI LoadLibrary( LPCTSTR lpFileName);

3. Після використання цієї функції необхідно перевірити успішність завантаження (результат не дорівнює 0).

4. Для кожної функції із бібліотеки, яку потрібно використовувати, треба визначити адресу цієї функції. Для цього використовується функція

FARPROC WINAPI GetProcAddress( HMODULE hModule, LPCSTR lpProcName );

де hModule – дескриптор бібліотеки;

lpProcName – імя функції (внутрішнє).

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

6. Далі функції викликаються як звичайні функції.

7. Після виклику останньої функції бібліотеку можна вигрузити. Для цього використовується функція FreeLibrary:

BOOL WINAPI FreeLibrary( HMODULE hModule);

8. Якщо функції DLL використовуються до кінця програми, функцію FreeLibrary можна не використовувати, операційна система визволить усі ресурси при завершенні програми. DLL відноситься до ресурсів.