Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodychka-lab_OS.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.35 Mб
Скачать

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

.code

start:

invoke TestHello

invoke ExitProcess,NULL

end start

Недоліком такого способу виклику бібліотеки: includelib My_DLL.lib є те, що в разі відсутності такої бібліотеки Windows видасть повідомлення про помилку підключення бібліотеки і програма не буде дальше виконуватись.

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

  1. Приклад програми завантаження 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

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

* * *

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

-- Далее --

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