- •Міністерство освіти і науки, молоді та спорту України Національний університет “Львівська політехніка”
- •Створення бібліотек динамічного компонування та їх використання в режимі неявного зв’язування
- •В либе прототипы функций, в длл - описание (код) створення бібліотек динамічного компонування та їх використання в режимі неявного зв’язування
- •Теоретичні відомості
- •Контрольні питання
- •Література
- •Порядок виконання
- •Варіанти завдань
- •Створення бібліотек динамічного компонування та їх використання в режимі неявНого зв’язування Методичні вказівки
Контрольні питання
1. Що таке DLL?
2. Що може міститися у DLL?
3. Що таке неявне зв’язування?
4. Як реалізувати неявне зв’язування?
5. Що необхідно мати для реалізації неявного зв’язування?
Література
1. Эпплман Д. Win32 API и Visual Basic. Для профессионалов (+CD). - СПб.: Питер, 2001. - 1120 с.: ил.
2. Юров В. Assembler: учебник. - СПб.: Питер, 2001. - 624 с.: ил.
3. Джонсон М. Харт Системное програмирование в среде Windows. 3-е издание.: Пер. с англ. – М.: Издательский дом «Вильямс», 2005. – 592 с.
Порядок виконання
Написання програми складається з 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. Підключення бібліотеки імпорту в проект.
6. Створюємо власну DLL бібліотеку для реалізації функцій згідно варіанту.
7. Створюємо програму, що використовує явне зв’язування DLL.
8. Готуємо та захищаємо звіт.
