
- •ЛЕКЦІЯ 5
- •ДИНАМІЧНІ БІБЛІОТЕКИ
- •ДИНАМІЧНІ БІБЛІОТЕКИ
- •ДИНАМІЧНІ БІБЛІОТЕКИ
- •ВИХІДНИЙ КОД ГОЛОВНОЇ ПРОГРАМИ
- •ВИХІДНИЙ КОД ГОЛОВНОЇ ПРОГРАМИ TSTPROJ
- •ВИХІДНИЙ КОД БІБЛІОТЕКИ DIALOGLNDLG.DLL, РЕАЛІЗОВАНИЙ НА MFC
- •МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLL
- •МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLL
- •МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLL
- •МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ DIALOGINDLG.DLL
- •МОДУЛЬ DLG, ЯКИЙ РЕАЛІЗУЄ ДІАЛОГОВЕ ВІКНО В БІБЛІОТЕЦІ
- •ВИХІДНИЙ КОД БІБЛІОТЕКИ DLLWIN32API.DLL, РЕАЛІЗОВАНОЇ НА WIN32 API
- •ВИХІДНИЙ КОД БІБЛІОТЕКИ DLLWIN32API.DLL, РЕАЛІЗОВАНОЇ НА WIN32 API
- •ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМ. CТАТИЧНА КОМПОНОВКА
- •ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМ. CТАТИЧНА КОМПОНОВКА
- •ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМ
- •ПІДКЛЮЧЕННЯ ДИНАМІЧНИХ БІБЛІОТЕК ДО ПРОГРАМ
- •ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
- •ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
- •ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
- •ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
- •ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
- •ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
- •ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ

ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
Бібліотека DllWin32API.DLL підключається до додатку за допомогою стандартних функцій Win32 API, які здійснюють завантаження бібліотеки динамічно в пам'ять. Це виконує наступний фрагмент коду:
HMODULE hDll = ::LoadLibrary(_T("DllWin32API.dll")); if(!hDll)
{
AfxMessageBox(«Помилка LoadLibrary!"); return;
}
21
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
Після завантаження бібліотеки необхідно обов'язково перевіряти правильність завершення цієї операції. Якщо бібліотека завантажена успішно, то можна здійснити отримання адреси функції експортованої з бібліотеки:
void (*pfn)();
pfn = (void (*)()) ::GetProcAddress(hDll,_T("MyFunc")); if(!pfn)
{
AfxMessageBox(«Помилка GetProcAddress!"); return;
}
pfn(); // виконання функції, реализованої в бібліотеці
Після того як бібліотека стане не потрібна, її необхідно вивантажити з пам'яті за допомогою функції FreeLibrary (hDll).
22
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
Розглянемо ще одну важливу особливість бібліотеки DllWin32API.DLL. Вона має функцію точки входу в бібліотеку в явному вигляді, де програміст може легко задати цілий ряд дій на наступні події:
DLL_PROCESS_ATTACH - підключення процесу бібліотеки;
DLL_THREAD_ATTACH - підключення потоку бібліотеки;
DLL_THREAD_DETACH - відключення потоку бібліотеки;
DLL_PROCESS_DETACH - відключення процесу бібліотеки.
23
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
На кожну з цих подій розробник може перевизначити відповідну віртуальну функцію. Нижче приведена функція точки входу до бібліотеки з розглянутого прикладу.
BOOL APIENTRY DllMain( HANDLE |
hModule, |
DWORD |
ul_reason_for_call, |
LPVOID |
lpReserved |
|
) |
{ |
|
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: return InitInstance(); break; case DLL_THREAD_ATTACH:break;
case DLL_THREAD_DETACH:break;
case DLL_PROCESS_DETACH: return ExitInstance(); break;
}
return TRUE;
} |
24 |
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
У прикладі визначені функції для подій DLL_PROCESS_ATTACH та DLL_PROCESS_DETACH. При виконанні цих подій видаються відповідні повідомлення. Перше повідомлення з'являється при завантаженні бібліотеки, а друге при вивантаженні. В даній бібліотеці експортована функція описана так: extern "C" __declspec (dllexport) void MyFunc ();
25
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
Наявність оголошення __declspec (dllexport) дає можливість використовувати цю функцію в викликаючому додатку, більш того наявність оператора extern "С" робить цю функцію задовільною щодо договору по утворенню імен С. Якщо цей оператор пропустити, то компілятор С++ застосує перетворення імен. Це призведе до неможливості використання даної функції з програми на Delphi без додаткової директиви name, опис якої було дано при розгляді принципів розробки бібліотек на Delphi. Цей опис можна модифікувати таким чином:
extern "C" __declspec (dllexport) void WINAPI MyFunc ();
26
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua

ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ
Використання модифікатора WINAPI дасть можливість встановити потрібний спосіб передачі параметрів. Це особливо важливо, якщо бібліотека буде використовуватися з програм написаних на Delphi. Зазначений модифікатор саме буде відповідати типу виклику stdcall, який підходить для використання в програмах на Delphi. Слід зазначити, що опис експортованої функції повинен бути обов'язково поміщений в файл заголовка *. H бібліотеки.
27
Операційні системи. Кафедра Інформатики. E-mail: informatika@kture.kharkov.ua