Дана бібліотека завантажується автоматично ОС 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
.code
start:
invoke TestHello
invoke ExitProcess,NULL
end start
Недоліком такого способу виклику бібліотеки: includelib My_DLL.lib є те, що в разі відсутності такої бібліотеки Windows видасть повідомлення про помилку підключення бібліотеки і програма не буде дальше виконуватись.
Щоб уникнути цієї проблеми, потрібно викликати бібліотеку за допомогою функцій LoadLibrary або LoadLibraryEx.
Приклад програми завантаження DLL
Дану бібліотеку завантажує програміст, використовуючи функцію LoadLibrary.
;-----------------------------------
; Prog_2.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\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?
.code
start:
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
Створення файлу лістінгу існуючої бібліотеки
У випадку, коли потрібно переглянути функції, які знаходяться у динамічно завантажуваній бібліотеці, можна використати програму 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
* * *
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
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
.code
start:
invoke TestHello, addr Message
invoke ExitProcess,NULL
end start
Хід роботи
1. Ознайомитись з основними теоретичними відомостями даної лабораторної роботи.
2. Ознайомитись з приведеними в теоретичних відомостях прикладами програм.
3. Ознайомитись з додатковими джерелами, приведеними в п.13 (Література).
4. Затвердити номер індивідуального завдання у викладача.
5. Виконати завдання згідно з номером.
Зміст звіту
Звіт повинен містити:
- титульну сторінку;
- мету роботи;
- завдання, робочий варіант тексту програми, результат виконання програми;
- короткі висновки по проведеній роботі.
Завдання
Розробити на мові асемблер для ОС 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 та викликати дану функцію з динамічно завантажуваної бібліотеки.
На 95 балів потрібно розробити дві програми згідно варіанту.
1. Розробити динамічно завантажувану бібліотеку, котра містить функцію, що виводить у вікні повідомлення поточний день тижня (Понеділок, …).
Розробити другу програму, котра використовує цю функцію.
2. Розробити динамічно завантажувану бібліотеку, котра містить функцію, що виводить у вікні повідомлення поточну директорію розміщення системних файлів ОС Windows. Розробити другу програму, котра використовує цю функцію.
3. Розробити динамічно завантажувану бібліотеку, котра містить функцію, що виводить у вікні повідомлення поточні координати курсору. Розробити другу програму, котра використовує цю функцію.
4. Розробити динамічно завантажувану бібліотеку, котра містить функцію, що виводить у вікні повідомлення поточний час (00:00:00). Розробити другу програму, котра використовує цю функцію.
5. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно повідомлення. Розробити другу програму, котра передає поточний день тижня (Понеділок, …) параметром у функцію бібліотеки.
6. Розробити динамічно завантажувану бібліотеку, котра містить функцію, що виводить у вікні повідомлення поточне ім’я користувача. Розробити другу програму, котра використовує цю функцію.
7. Розробити динамічно завантажувану бібліотеку, котра містить функцію, що виводить у вікні повідомлення поточне ім’я комп’ютера. Розробити другу програму, котра використовує цю функцію.
8. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно повідомлення. Розробити другу програму, котра передає поточний час (00:00:00) параметром у функцію бібліотеки.
9. Розробити динамічно завантажувану бібліотеку, котра містить функцію, що виводить у вікні повідомлення поточний місяць (Січень,…). Розробити другу програму, котра використовує цю функцію.
10. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно повідомлення. Розробити другу програму, котра передає поточні координати курсору параметром у функцію бібліотеки.
11. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно повідомлення. Розробити другу програму, котра передає поточний місяць (Січень,…) параметром у функцію бібліотеки.
12. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно консолі. Розробити другу консольну програму, що передає поточний місяць (Січень,..) параметром у функцію бібліотеки.
13. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно повідомлення. Розробити другу програму, що передає поточне ім’я комп’ютера параметром у функцію бібліотеки.
14. Розробити динамічно завантажувану бібліотеку, котра містить функцію, що виводить у вікні повідомлення поточну директорію розміщення ОС Windows.
15. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно консолі. Розробити другу консольну програму, що передає поточне ім’я комп’ютера параметром у функцію бібліотеки.
16. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно повідомлення. Розробити другу програму, що передає поточні координати курсору параметром у функцію бібліотеки
17. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно консолі. Розробити другу консольну програму, що передає поточний час (00:00:00) параметром у функцію бібліотеки.
18. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно повідомлення. Розробити другу програму, котра передає поточну директорію розміщення системних файлів ОС Windows параметром у функцію бібліотеки.
19. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно консолі. Розробити другу консольну програму, що передає Поточний місяць (Січень,..) параметром у функцію бібліотеки.
20. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно повідомлення Розробити другу програму, що передає поточну дату (00.00.00) параметром у функцію бібліотеки.
21. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно консолі. Розробити другу консольну програму, що передає поточну дату (00.00.00) параметром у функцію бібліотеки.
22. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно консолі. Розробити другу консольну програму, що передає поточну директорію розміщення ОС Windows параметром у функцію бібліотеки.
23. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно повідомлення. Розробити другу програму, що передає поточний день тижня (Понеділок,…) параметром у функцію бібліотеки.
24. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно повідомлення. Розробити другу програму, що передає поточну директорію розміщення системних файлів ОС Windows.
25. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно консолі. Розробити другу консольну програму, що передає поточне ім’я користувача параметром у функцію бібліотеки.
26. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно консолі. Розробити другу консольну програму, що передає поточну дату (00.00.00) параметром у функцію бібліотеки.
27. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно консолі. Розробити другу консольну програму, що передає поточну директорію розміщення ОС Windows параметром у функцію бібліотеки.
28. Розробити динамічно завантажувану бібліотеку, котра використовує функцію, що виводить отриманий параметр у вікно консолі. Розробити другу консольну програму, що передає поточне ім’я користувача параметром у функцію бібліотеки.
Контрольні запитання
1. Яка різниця між dll та lib бібліотеками?
2. Які є два способи завантаження dll?
3. Яка функція завантажує dll?
4. Яка функція вивантажує dll?
5. З допомогою яких програм можна створити файл лістингу dll?