Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LABA6_2011.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
218 Кб
Скачать
☆

Контрольні питання

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. Готуємо та захищаємо звіт.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]