Приклад використання функції з бібліотеки

Дана бібліотека завантажується автоматично ОС 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?

 

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: