Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Слайд_ОС_ПМ / OS-Lection-5.ppt
Скачиваний:
43
Добавлен:
05.06.2014
Размер:
1.06 Mб
Скачать

ЗАВАНТАЖЕННЯ БІБЛІОТЕКИ В ПРОЦЕСІ РОБОТИ ПРОГРАМИ

Бібліотека 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

Соседние файлы в папке Слайд_ОС_ПМ