You are on page 1of 11

Лабораторна робота №5

Тема: Створення динамічних бібліотек DLL.


Мета: Навчитись створювати динамічні бібліотеки DLL в середовищі ОС
Windows.

1. Основні теоретичні відомості

У процесі розробки програми іноді виникає потреба у використанні


функції із іншої програми. Цю функцію можна просто скопіювати, що
затруднить читання програми і відповідно збільшить розміри виконуваного
файла. Можна також створити окремі об’єктні модулі (*.obj) з потрібних функцій
і включити їх у бібліотеку (*.lib), і згодом викликати ці модулі із своєї програми.
Такий процес називається статичним компонуванням (лінкуванням - Static
Linking). У цьому випадку при компонуванні (лінкуванні) програми з
бібліотекою компоновщик (лінкувальник) вибирає ті функції, які необхідні
нашій програмі і вставляє їх у виконуваний файл. Такий процес не зменшує
розмір виконуваного файлу, але дозволяє зробити код програми меншим,
нагляднішим і легшим для сприйняття і читання. Даний спосіб використовувався
для комп’ютерів з операційною системою MS-DOS. Недоліком цього способу є
те, що можна створити велику кількість виконуваних файлів, які будуть мати
ідентичні функції. Та для ОС MS-DOS це не було дуже важливою проблемою,
оскільки в пам’яті могла бути тільки одна активна програма.
Інша ситуація в ОС Windows, де в пам’ять завантажується велика кількість
виконуваних програм, а якщо ці програми мають функції що повторюються, то
такий спосіб буде загромаджувати пам’ять. Цю проблему розв’язують динамічні
бібліотеки (DLL – Dynamic Link Libraries). Динамічна бібліотека являє собою
велику кількість функцій які зібрані у один файл. При запуску програми, котра
використовує бібліотеку DLL, Windows автоматично завантажує її у пам’ять.
Якщо запустити іншу програму, що використовує цю ж саму DLL, то Windows
вже не буде завантажувати другої копії DLL у пам’ять. В пам’яті буде лише одна
копія DLL яку запущені процеси розділяють між собою. Копіюється тільки
секція даних для кожного процесу. В даному випадку програма компонується
(лінкується) з DLL під час виконання. Такий спосіб називається динамічним
компонуванням (лінкуванням - Dynamic Linking).
Динамічна бібліотека може мати різні розширення, наприклад .EXE, .FON.
Стандартним розширенням є .DLL. ОС Windows автоматично завантажує тільки
такі бібліотеки. Бібліотеки з іншим розширенням потрібно завантажити з
програми, використовуючи функції LoadLibrary або LoadLibraryEx.

1
2. Приклад програми створення DLL
;--------------------------------------------------
; My_DLL.asm
;---------------------------------------------------
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
AppName db "My_DLL",0
HelloMsg db "Привіт! Це функція з бібліотеки My_DLL",0
LoadMsg db "Завантаження бібліотеки DLL у пам'ять ",0
UnloadMsg db "Вивантаження бібліотеки DLL з пам'яті",0
ThreadCreated db "Створення вітки у цьому процесі",0
ThreadDestroyed db "Знищення вітка цього процесу",0

.code
DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
.if reason==DLL_PROCESS_ATTACH
invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK
.elseif reason==DLL_PROCESS_DETACH
invoke MessageBox,NULL,addr UnloadMsg,addr AppName,MB_OK
.elseif reason==DLL_THREAD_ATTACH
invoke MessageBox,NULL,addr ThreadCreated,\
addr AppName,MB_OK
.else ;.if reason== DLL_THREAD_DETACH
invoke MessageBox,NULL,addr ThreadDestroyed,\
addr AppName,MB_OK
.endif
mov eax,TRUE
ret
DllEntry Endp

TestHello proc
invoke MessageBox,NULL,addr HelloMsg,addr AppName,MB_OK
ret
TestHello endp

End DllEntry

Опис файлу лістинга з розширенням *.def


;------------
-- ;
My_DLL.def
;--------------
LIBRARY My_DLL
EXPORTS TestHello

3. Опис програми My_DLL.asm та файлу лістінга My_DLL.def

2
Кожна DLL повинна мати стартову функцію.
Windows викликає цю функцію у випадку коли:
- DLL завантажується перший раз у пам’ять;
- DLL вивантажується з пам’яті;
- створюється нова вітка в цьому ж процесі;
- знищується нова вітка цього процесу; Ця
функція одержує три параметри:
hinstDLL – це дескриптор модуля DLL.
reason - може мати одне з чотирьох значень:
• DLL_PROCESS_ATTACH – DLL одержує це значення коли вперше
загружається в адресний простір процесу.
• DLL_PROCES_DETACH – DLL одержує це значення коли
вивантажується з адресного простору процесу.
• DLL_THREAD_ATTACH – DLL одержує це значення коли процес
створює нову вітку.
• DLL_THREAD_DETACH –DLL одержує це значення коли процес
reserved – визначає наступні аспекти встановлення або очищення
DLL. (рідко викоритовується)
Для того, щоб можна було використовувати функції з бібліотеки іншою
програмою, їх потрібно оголосити в файлі імпорту : My_DLL.def
LIBRARY My_DLL
EXPORTS TestHello LIBRARY - Вказує ім’я
бібліотеки.
EXPORTS - Повідомляє компонувальник (лінкер) які функції в DLL
експортуються, тобто викликаються із інших програм. В даному випадку нам
потрібно щоб інші програми могли викликати функцію TestHello.

4. Трансляція та компонування DLL

Для того, щоб відтранслювати(ML.EXE) та зкомпонувати (LINK.EXE)


даний .ASM код, потрібно використовувати наступні параметри:
ML.EXE /c /coff /Cp My_DLL.asm LINK.EXE /DLL /SUBSYSTEM:WINDOWS
/DEF:My_DLL.def /LIBPATH:d:\masm32\lib My_DLL.obj

Опис параметрів:
/c – говорить MASM’у створити .obj файл формату COFF (Common
Object File), який використовується в ОС UNIX як його власний
об'єктний і виконуваний формат файлів.
/Cp – говорить MASM’у зберігати регістр назв, заданих програмістом.
Можна також вставити в код програми (після директиви .model) стрічку
:option casemap:none, щоб одержати такий самий ефект, тобто, щоб MASM
розрізняв великі і малі символи.
3
/DLL – говорить link’еру створити DLL
/SUBSYSTEM:WINDOWS – говорить ink’еру якого виду буде
виконуваний модуль.
/DEF - підключає файл імпорту в якому оголошені функції.
/LIBPATH – говорить link’еру де знаходяться бібліотеки імпорту.
5. Приклад використання функції з бібліотеки

Дана бібліотека завантажується автоматично ОС Windows.


;----------------------------------
-- ; Prog.asm
;------------------------------------
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc

includelib My_DLL.lib

includelib \masm32\lib\kernel32.lib

TestHello PROTO

.c
od
e
st
ar
t:
invoke TestHello
invoke ExitProcess,NULL end
start

Недоліком такого способу виклику бібліотеки: includelib My_DLL.lib є


те, що в разі відсутності такої бібліотеки Windows видасть повідомлення про
помилку підключення бібліотеки і програма не буде дальше виконуватись.
Щоб уникнути цієї проблеми, потрібно викликати бібліотеку за
допомогою функцій LoadLibrary або LoadLibraryEx.

6. Приклад програми завантаження DLL

Дану бібліотеку завантажує програміст, використовуючи функцію


LoadLibrary.
;---------------------------------
-- ; Prog_2.asm
;-----------------------------------
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc

4
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

.data
LibName db "My_Dll.dll",0
FunctionName db "TestHello",0
DllNotFound db "Неможливо загрузити бібліотеку",0
AppName db "Load Library",0
FunctionNotFound db "Неможливо знайти TestHello функцію",0
.data? hLib dd
?
TestHelloAddr
dd ?

.c
od
e
st
ar
t:
invoke LoadLibrary,addr LibName
.if eax==NULL
invoke MessageBox,NULL,addr DllNotFound,\
addr AppName,MB_OK
.else
mov hLib,eax
invoke GetProcAddress,hLib,addr FunctionName
.if eax==NULL
invoke
MessageBox,NULL,\
addr
FunctionNotFound,\
addr AppName,MB_OK
.else
mov TestHelloAddr,eax
call [TestHelloAddr]; Виклик ф-ї з
; бібліотеки
.endif
invoke FreeLibrary,hLib ; Зменшує лічильник
зсилок ; на бібліотеку ,якщо цей лічильник рівний нулю, то це
означає, що
;бібліотеки вже ніхто не використовує і вона
вивантажується з ;пам’яті .endif
invoke ExitProcess,NULL
end start

7. Створення файлу лістінгу існуючої бібліотеки

У випадку, коли потрібно переглянути функції, які знаходяться у


динамічно завантажуваній бібліотеці, можна використати програму
DUMPBIN.EXE з пакету MASM32 або IMPDEF.EXE з пакету TASM.

Вигляд командного рядка для програми dumpbin.exe:


E:\masm32\BIN>DUMPBIN.EXE /EXPORTS USER32.DLL > Hello.txt
E:\masm32\BIN>type Hello.txt | more
5
* * *
ordinal hint RVA name

1 0 00001371 ActivateKeyboardLayout
2 1 00005940 AdjustWindowRect
3 2 0000161B AdjustWindowRectEx
4 3 00001158 AlignRects

Вигляд командного рядка для програми impdef.exe:


D:\impdef.exe Ours_File.def user32.dll
D:\type Ours_File.def |
more
LIBRARY USER32.DLL
EXPORTS
ActivateKeyboardLayout @1
AdjustWindowRect @2
AdjustWindowRectEx @3
AlignRects @4
AnimateWindow @5
AnyPopup @6
AppendMenuA @7
AppendMenuW @8
ArrangeIconicWindows @9
AttachThreadInput @10
-- Далее --
8. Приклад передачі даних у функцію бібліотеки

Створення динамічно завантажуваної бібліотеки


;-----------------------------------
-- ; The_Dll.asm
;-------------------------------------
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
AppName db "My_DLL",0
.code

DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD


mov eax,TRUE
ret
DllEntry Endp

TestHello proc lpszText:DWORD


invoke MessageBox,NULL, lpszText, addr AppName,MB_OK
ret
TestHello endp

6
invoke ExitProcess, NULL
End DllEntry

Передача параметру у функцію бібліотеки


;--------------------------------------------------
; Use_DLL.asm
;---------------------------------
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib
The_DLL.lib
includelib
\masm32\lib\kernel32.lib

TestHello PROTO :DWORD

.data
Message db "Hello, World",0

.c
od
e
st
ar
t:
invoke TestHello, addr
Message invoke
ExitProcess,NULL end start

9. Хід роботи

1. Ознайомитись з основними теоретичними відомостями даної


лабораторної роботи.
2. Ознайомитись з приведеними в теоретичних відомостях прикладами
програм.
3. Ознайомитись з додатковими джерелами, приведеними в п.13
(Література).
4. Затвердити номер індивідуального завдання у викладача.
5. Виконати завдання згідно з номером.

10. Зміст звіту

Звіт повинен містити:


- титульну сторінку;
- мету роботи;

7
- завдання, робочий варіант тексту програми, результат виконання
програми;
- короткі висновки по проведеній роботі.

11. Завдання

Розробити на мові асемблер для ОС Windows програми, використовуючи


пакет MASM32. Результат виводиться на екран.

На 60 балів потрібно розробити дві програми. Одна програма має


створювати динамічно завантажувану бібліотеку. Дана бібліотека має містити
функцію, котра виводить Ф.І.П. у вікні повідомлення. Інша програма має
завантажити цю бібліотеку використовуючи директиву includelib та
викликати дану функцію з динамічно завантажуваної бібліотеки.

Тип вікна повідомлення – згідно варіанту:


№ № Тип
1 2 MB_ABORTRETRYIGNORE
3 4 MB_OK
5 6 MB_OKCANCEL
7 8 MB_RETRYCANCEL
9 10 MB_YESNO
11 12 MB_YESNOCANCEL
13 14 MB_ICONEXCLAMATION
15 16 MB_ICONWARNING
17 18 MB_ICONINFORMATION
19 20 MB_ICONASTERISK
21 22 MB_ICONQUESTION
23 24 MB_ICONSTOP
25 26 MB_ICONERROR
27 28 MB_ICONHAND

На 75 балів потрібно розробити дві програми. Одна програма має


створювати динамічно завантажувану бібліотеку. Дана бібліотека має містити
функцію, котра виводить Ф.І.П. у вікні повідомлення (тип повідомлення
згідно завдання на 60 балів). Інша програма має завантажити цю бібліотеку
використовуючи функцію LoadLibrary та викликати дану функцію з
динамічно завантажуваної бібліотеки.

8
На 95 балів потрібно розробити дві програми згідно варіанту.
1. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточний день тижня
(Понеділок, …). Розробити другу програму, котра використовує цю
функцію.
2. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточну директорію
розміщення системних файлів ОС Windows. Розробити другу
програму, котра використовує цю функцію.
3. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточні координати
курсору . Розробити другу програму, котра використовує цю функцію.
4. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточний час (00:00:00).
Розробити другу програму, котра використовує цю функцію.
5. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, котра передає поточний день тижня
(Понеділок, …) параметром у функцію бібліотеки.
6. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточне ім’я користувача .
Розробити другу програму, котра використовує цю функцію.
7. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточне ім’я комп’ютера.
Розробити другу програму, котра використовує цю функцію.
8. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, котра передає поточний час (00:00:00)
параметром у функцію бібліотеки.
9. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточний місяць
(Січень,…). Розробити другу програму, котра використовує цю
функцію.
10. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, котра передає поточні координати курсору
параметром у функцію бібліотеки.
11. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, котра передає поточний місяць (Січень,…)
параметром у функцію бібліотеки.

9
12. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточний місяць (Січень,..)
параметром у функцію бібліотеки.
13. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, що передає поточне ім’я комп’ютера
параметром у функцію бібліотеки.
14. Розробити динамічно завантажувану бібліотеку, котра містить
функцію, що виводить у вікні повідомлення поточну директорію
розміщення ОС Windows.
15. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточне ім’я комп’ютера
параметром у функцію бібліотеки.
16. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, що передає поточні координати курсору
параметром у функцію бібліотеки
17. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточний час (00:00:00)
параметром у функцію бібліотеки.
18. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, котра передає поточну директорію
розміщення системних файлів ОС Windows параметром у функцію
бібліотеки.
19. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає Поточний місяць (Січень,..)
параметром у функцію бібліотеки.
20. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення
Розробити другу програму, що передає поточну дату (00.00.00)
параметром у функцію бібліотеки.
21. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточну дату (00.00.00)
параметром у функцію бібліотеки.
22. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
10
другу консольну програму, що передає поточну директорію
розміщення ОС Windows параметром у функцію бібліотеки.
23. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, що передає поточний день тижня
(Понеділок,…) параметром у функцію бібліотеки.
24. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно повідомлення.
Розробити другу програму, що передає поточну директорію
розміщення системних файлів ОС Windows.
25. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточне ім’я користувача
параметром у функцію бібліотеки.
26. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточну дату (00.00.00)
параметром у функцію бібліотеки.
27. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточну директорію
розміщення ОС Windows параметром у функцію бібліотеки.
28. Розробити динамічно завантажувану бібліотеку, котра використовує
функцію, що виводить отриманий параметр у вікно консолі. Розробити
другу консольну програму, що передає поточне ім’я користувача
параметром у функцію бібліотеки.
12. Контрольні запитання

1. Яка різниця між dll та lib бібліотеками?


2. Які є два способи завантаження dll?
3. Яка функція завантажує dll?
4. Яка функція вивантажує dll?
5. З допомогою яких програм можна створити файл лістингу dll?

13. Список використаної літератури

8. Help по функціях API - www.nan32asm.cjb.net


9. Microsoft Windows Help - Win32 Programmers Reference
10. Технічна документація Microsoft - MSDN
11. www.win32asm.newmail.ru/
Книга по програмуванню під Windows - www.win32asm.cjb.net
11

You might also like