СТВОРЕННЯ БІБЛІОТЕК ДИНАМІЧНОГО КОМПОНУВАННЯ ТА ЇХ ВИКОРИСТАННЯ В РЕЖИМІ НЕЯВНОГО ЗВ’ЯЗУВАННЯ

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2012
Тип роботи:
Інші
Предмет:
Системне програмування
Група:
КІ-31

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки, молоді та спорту України Національний університет “Львівська політехніка”  Кафедра ЕОМ Системне програмування СТВОРЕННЯ БІБЛІОТЕК ДИНАМІЧНОГО КОМПОНУВАННЯ ТА ЇХ ВИКОРИСТАННЯ В РЕЖИМІ НЕЯВНОГО ЗВ’ЯЗУВАННЯ Тема: СТВОРЕННЯ БІБЛІОТЕК ДИНАМІЧНОГО КОМПОНУВАННЯ ТА ЇХ ВИКОРИСТАННЯ В РЕЖИМІ НЕЯВНОГО ЗВ’ЯЗУВАННЯ Мета: Ознайомитись з технологією створення та використання бібліотек динамічного компонування з використанням неявного зв’язування. ТЕОРЕТИЧНІ ВІДОМОСТІ DLL (англ. Dynamic-link library — динамічно завантажувана бібліотека) — реалізовані компанією Microsoft загальні бібліотеки в ОС Windows. Як правило бібліотеки мають розширення файлу *.dll, *.ocx (для бібліотек, що містять елементи керування ActiveX) або *.drv (драйвери старих версій ОС). Структура DLL така сама, як і в PE-файлів (Portable Executable) для 32-, 64-розрядних Windows, та New-Executable (NE) для 16-бітових Windows. DLL може містити 2 типи функцій: експортні та внутрішні. Експортні функції визначаються за допомогою ключового слова __declspec(dllexport) і можуть бути викликані з програм, що завантажили динамічну бібліотеку, яка містить ці функції. Внутрішні функції – це функції, які використовуються в середині DLL і не можуть бути викликані ззовні. DLL є модулем (module). Тобто, вона складається з: сегментів коду, сегментів ресурсів та одного сегменту даних. Крім цього DLL може містити точку входу. Точка входу – це функція DllMain, яка викликається при завантаженні або вивантажені бібліотеки потоком або процесом. Ця функція має наступний прототип: BOOL APIENTRY DllMain( HANDLE hModule, // Хендл DLL модуля DWORD ul_reason_for_call, // Причина виклику LPVOID lpReserved ); // Зарезервовано Якщо DllMain повертає FALSE, то бібліотека вважається такою, що не завантажилася. При неявному зв’язуванні це призведе до відмови запуску програми, а при явному – помилки завантаження лише цієї бібліотеки. В процесі виконання вміст бібліотеки залишається незмінним (сегменти коду та сегменти ресурсів), що дозволяє завантажувати її в пам’ять в єдиному екземплярі і використовувати багатьма завданнями одночасно. Використання dll дозволяє економити пам’ять, забезпечити модульність програм, полегшити процес встановлення програм. Можливі 2 способи використання динамічних бібліотек. Вони називаються явним та неявним зв’язуванням. Явне та неявне зв’язування бібліотеки з програмою мають суттєві відмінності в процесі написання та компіляції програми. Неявне зв’язування бібліотеки з програмою (Load-time dynamic linking) полягає в тому, що бібліотека (яка міститься у файлі з розширенням .dll) завантажується в пам’ять в момент завантаження програми. При відсутності бодай однієї з бібліотек при запуску програми відбудеться збій та припинення виконання програми. Щоб реалізувати неявне зв’язування необхідно до проекту програми включити прототипи функцій, що містяться в бібліотеці та бібліотеку імпорту (має розширення .lib). На даному етапі наявність файлу з розширенням .dll не є необхідною. При компіляції лінкер створює виконавчий файл, який містить код, що забезпечує систему інформацією, яка необхідна для автоматичного завантаження бібліотеки з .dll файлу та інформацією, яка необхідна для зв’язування імен функцій у програмі з їх адресами у бібліотеці. Неявне зв’язування дозволяє здійснювати виклик функцій з бібліотеки написанням коду програми в стилі притаманному мовам С\С++. ВИКОНАННЯ РОБОТИ Написання програми складається з 2-ох етапів. На першому етапі створюється бібліотека. На другому етапі – створюється програма, яка викликатиме функції з створеної бібліотеки. 1. Для створення бібліотеки створюємо новий проект типу Win32 Project та в налаштуваннях вибираємо тип проекту DLL, так як показано на рис. 1:  Рис.1. Вибір типу проекту для створення DLL засобами MSVS. 2. Створюємо заголовний файл бібліотеки (з розширенням .h) для забезпечення експортування інтерфейсів функцій Заголовний файл (DLLTEST.H) #ifndef _DLLTEST_H_ #define _DLLTEST_H_ #include <iostream> #include <stdio.h> #include <windows.h> using namespace std; extern "C" __declspec(dllexport) void NumberList(); extern "C" __declspec(dllexport) void LetterList(); #endif 3. Створюємо .срр файл з вмістом коду бібліотеки. Код бібліотеки (DLLTEST.CPP) #include "dlltest.h" #define MAXMODULE 50 char module[MAXMODULE]; extern "C" __declspec(dllexport) void NumberList() {     GetModuleFileName(NULL, (LPTSTR)module, MAXMODULE);     cout << "This function was called from "     << module     << endl << endl;     cout << "NumberList(): ";     for(int i=0; i<10; i++)     {        cout << i << " ";     }     cout << endl << endl; } extern "C" __declspec(dllexport) void LetterList() {     GetModuleFileName(NULL, (LPTSTR)module, MAXMODULE);     cout << "This function was called from "     << module     << endl << endl;     cout << "LetterList(): ";     for(int i=0; i<26; i++)     {        cout << char(97 + i) << " ";     }     cout << endl << endl; } Бібліотека містить 2 функції, які виводять текст на консоль. Рядок extern "C" __declspec(dllexport) означає, що функцію буде видно зовні DLL (тобто її можна викликати з іншої програми). Після компіляції ми одержимо DLL – бібліотеку, яка складатиметься з 2-о файлів: dlltest.dll, dlltest.lib. Зауважимо, що дана бібліотека, хоч і не має явно оголошеної точки входу, проте функція DllMain все ж таки буде створена неявно, хоч нічого і не робитиме. 4. На другому етапі створюємо новий проект типу Win32 Project та в налаштуваннях вибираємо тип проекту Console Application. Додаємо до проекту заголовочний файл бібліотеки, який створений нами на кроці 2. Підключаємо бібліотеку імпорту в властивостях проекту як показано на рис. 2. 5. Пишемо програму в стилі С/С++, яка здійснюватиме виклик функцій з бібліотеки як показано нижче. Компілюємо і запускаємо програму. #include <conio.h> #include "dlltest.h" void main() {     NumberList();     LetterList();     getch(); }  Рис.2. Підключення бібліотеки імпорту в проект. ВИСНОВОК: Я ознайомився з технологією створення та використання бібліотек динамічного компонування з використанням неявного зв’язування.
Антиботан аватар за замовчуванням

15.12.2012 20:08

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!