Приклади додатків, що працюють з власними DLL

Розглянемо використання власних DLL на кількох прикладах

Приклад 1 Розглянемо три функції, що включаються в DLL: обчислення ступеня числа, перетворення числа в рядок і виведення числа, що зберігається в регістрі ЕАХ

Спочатку напишемо код, в якому реалізуються функції DLL Назо-вем файл MyDLLasm

.model flat, stdcall option casemap :none

include d:\masm32\include\windowsinc include d:\masm32\include\user32inc include d:\masm32\include\kernel32inc includelib d:\masm32\lib\user32lib includelib d:\masm32\lib\kernel32 Lib szText MACRO Name, Text: VARARG LOCAL 1И

jmp 1И

Name db Text,0

1И: ENDM

m2m MACRO Ml, M2 push M2 pop Ml ENDM

return MACRO arg mov eax, arg ret ENDM data

hlnst dd 0 buf db 5 dup(O)

szDisplayName db Повідомлення, 0 code LibMain proc hInstDLL: DWORD, reason: DWORD,

unused:DWORD szText LmTitle,&quottstdlls LibMain Function&quot mov eax,hInstDLL mov hlnst,eax

.if reason == DLL_PROCESS_ATTACH

szText ATTACHPROCESS,&quotPROCESS_ATTACH&quot invoke MessageBox,NULL,ADDR ATTACHPROCESS,

addr LmTitle,MB_OK return TRUE elseif reason == DLL_PROCESS_DETACH

szText DETACHPROCESS,&quotPROCESS_DETACH&quot invoke MessageBox,NULL,addr DETACHPROCESS, addr LmTitle,MB_OK elseif reason == DLL_THREAD_ATTACH

szText ATTACHTHREAD,&quotTHREAD_ATTACH&quot invoke MessageBox,NULL,addr ATTACHTHREAD, addr LmTitle,MB_OK elseif reason == DLL_THREAD_DETACH

szText DETACHTHREAD,&quotTHREAD_DETACH&quot invoke MessageBox,NULL,addr DETACHTHREAD, addr LmTitle,MB_OK endif ret

LibMain Endp Функції бібліотеки ступінь аЛЬ

step proc a :DWORD, b :DWORD mov eax,0 mov ecx,b mov eax,1 11: mul a loop 11 return eax

step endp

; Переклад з числа в рядок

IntToStr proc a :DWORD

mov eax,a

mov ebx,10

mov ecx,0

conv: if eax &amp 8000h

mov edx,Offffh else

mov edx,Oh endif

div ebx

or dl,30h

ror ecx,8

mov cl,dl

cmp eax,0

jne conv

ror ecx,8

return ecx IntToStr endp

; висновок вмісту регістра ЕАХ out_eax proc

mov buf[4],0

mov buf[3],al

shr eax,8

mov buf[2],al

shr eax,8

mov buf[1],al

shr eax,8

mov buf[0],al

invoke MessageBox,NULL,ADDR buf, ADDR szDisplayName,MB_OK

return 0 out_eax endp End LibMain

Експортовані функції з бібліотеки описуються у файлі MyDlldef:

LIBRARY MyDll EXPORTS step EXPORTS IntToStr EXPORTS out eax

Для демонстрації виклику функцій з бібліотеки напишемо додаток, на формі якого розташуємо два елементи Edifflox для введення чисел і кнопку для виконання обчислень і виводу результату за допомогою функцій з бібліотеки Текст програми, що зберігається у файлі MyCallDllasm, наведено нижче

.model flat, stdcall

option casemap :none

include d:\masm32\include\windowsinc

include d:\masm32\include\user32inc

include d:\masm32\include\kernel32inc

includelib d:\masm32\lib\user32lib

includelib d:\masm32\lib\kernel32lib

szText MACRO Name, Text:VARARG

LOCAL 1И jmp 1И

Name db Text, 0 1И: ENDM m2m MACRO Ml, M2

push M2

pop Ml ENDM return MACRO arg

mov eax, arg

ret ENDM

WinMain PROTO: DWORD,: DWORD,: DWORD,: DWORD WndProc PROTO: DWORD,: DWORD,: DWORD,: DWORD TopXY PROTO: DWORD,: DWORD функція для створення кнопки Pushbutton PROTO: DWORD,: DWORD,: DWORD,: DWORD,: DWORD,

: DWORD,: DWORD функція для створення EditBox EditSl PROTO: DWORD,: DWORD,: DWORD,: DWORD,: DWORD,

:DWORD,:DWORD EdlProc PROTO :DWORD,:DWORD,:DWORD,:DWORD data

szDisplayName db Робота з DLL: порахувати аЛЬ , 0 CommandLine dd 0 hWnd dd 0 дескриптор вікна hlnstance dd 0 дескриптор додатка aa dd 0

step  dd 0

IntToStr  dd 0

out_eax dd 0

hEditl  dd 0

; дескриптор першого EditBox

hEdit2  dd 0

; дескриптор другого EditBox

nuUbyte db 0

lpfnEdlProc dd 0

; адреса віконної функції EditBox

numl dd 0 перше число

mim2 dd 0 друге число

. code

start:

invoke GetModuleHandle, NULL

mov hlnstance, eax

invoke GetCommandLine

mov CommandLine, eax

invoke WinMain,hlnstance,NULL,CommandLine, SW_SHOWDEFAULT

invoke ExitProcess,eax WinMain proc hlnst     :DWORD, hPrevInst :DWORD, CmdLine   :DWORD, CmdShow   :DWORD

LOCAL wc   :WNDCLASSEX

LOCAL msg  :MSG

LOCAL Wwd  :DWORD

LOCAL Wht  :DWORD

LOCAL Wtx  : DWORD

LOCAL Wty  :DWORD

mov wccbSize, sizeof WNDCLASSEX

mov wcstyle, CS_HREDRAW or CS_VREDRAW \ or CS_BYTEALIGNWINDOW

mov wclpfnWndProc,  offset WndProc

mov wccbClsExtra, NULL

mov wccbWndExtra, NULL

m2m wchlnstance, hlnst

mov wchbrBackground,  COLOR_BTNFACE+l

mov wclpszMenuName, NULL

mov wclpszClassName,  offset szClassName

invoke LoadIcon, hlnst, 500 ідентифікатор піктограми з файлу ресурсів

mov wchlcon, eax

invoke LoadCursor,NULL,IDC_ARROW

mov wchCursor, eax

mov wchlconSm, 0

invoke RegisterClassEx, ADDR wc для виведення вікна в центрі екрану отримаємо його розміри mov Wwd, 290 mov Wht, 200

invoke GetSystemMetrics,SM_CXSCREEN invoke TopXY,Wwd,eax mov Wtx, eax

invoke GetSystemMetrics,SM_CYSCREEN invoke TopXY,Wht,eax mov Wty, eax

szText szClassName,&quotCallDLL_Class&quot invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,

ADDR szClassName, ADDR szDisplayName, WS_OVERLAPPEDWINDOW, Wtx,Wty,Wwd, Wht, NULL,NULL, hInst,NULL mov hWnd,eax

invoke ShowWindow,hWnd,SW_SHOWNORMAL invoke UpdateWindow,hWnd StartLoop:

invoke GetMessage,ADDR msg,NULL,0,0 amp eax, 0 je ExitLoop

invoke TranslateMessage, ADDR msg invoke DispatchMessage,  ADDR msg jmp StartLoop ExitLoop:

return msgwParam WinMain endp віконна функція WndProc proc hWin: DWORD, uMsg: DWORD,

wParam: DWORD, lParam: DWORD LOCAL hLib: DWORD if uMsg == WM_COMMAND якщо натиснута кнопка

.if wParam == 500 jmp @F

libName db &quotMyDlldll&quot,0 FuncName db &quotstep&quot,0 FuncName2 db &quotIntToStr&quot,0 sout_eax db &quotout_eax&quot,0 @@:

invoke LoadTii brary,ADDR libName mov hLib, eax invoke GetProcAddress,hLib,ADDR FuncName2

mov IntToStr,eax

invoke GetProcAddress,hLib,ADDR sout_eax mov out_eax,eax

invoke GetProcAddress,hLib,ADDR FuncName mov step,eax push dword ptr numl push dword ptr num2 call step push eax call IntToStr call out_eax invoke FreeLibrary,hLib endif elseif uMsg == WM_CREATE

szText Butnl, Порахувати

invoke PushButton,ADDR Butnl,hWin,

20,20,140,25,500 invoke EditSl,ADDR nulbyte,120,60,

100,23,hWin,200 mov hEditl, eax invoke EditSl,ADDR nulbyte,20,100,

100,23,hWin,200 mov hEdit2, eax invoke SetWindowLong,hEditl,GWL_WNDPROC,

EdlProc mov lpfnEdlProc, eax invoke SetWindowLong,hEdit2,GWL_WNDPROC,

EdlProc mov lpfnEdlProc, eax elseif uMsg == WM_DESTROY

invoke PostQuitMessage,NULL return 0 endif

invoke DefWindowProc,hWin,uMsg,wParam,IParam ret WndProc endp

; отримання координат центру екрану TopXY proc wDim: DWORD, sDim: DWORD shr sDim, 1 shr wDim, 1 mov eax, wDim sub sDim, eax return sDim TopXY endp створення кнопки PushButton proc IpText: DWORD, hParent: DWORD,

a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD

szText btnClass,&quotBUTTON&quot

invoke CreateWindowEx, 0, ADDR btnClass, lpText, WS_CHILD or WS_VISIBIiE, a, b, wd, ht, hParent, ID, hlnstance, NULL ret Pushbutton endp створення EditBox EditSl proc szMsg: DWORD, a: DWORD, b: DWORD,

wd:DWORD,ht:DWORD,hParent:DWORD,ID:DWORD szText slEdit,&quotEDIT&quot

invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR slEdit,szMsg,

WS_VISIBLE or WS_CHILDWINDOW or \ ES_AUTOHSCROLL or ES_NOHIDESEL, a,b,wd,ht,hParent,ID,hlnstance,NULL ret EditSl endp

; віконна функція для EditBox EdlProc proc hCtl: DWORD, uMsg: DWORD,

wParam: DWORD, lParam: DWORD формування числа з рядка if uMsg == WM_CHAR

. If wParam == 8 натиснуто backspace

mov eax,hEditl if hCtl = eax

mov numl,0 else

mov num2,0 endif

jmp accept endif if wParam &lt &quot0&quot

return 0 endif if wParam &gt &quot9&quot

return 0 endif

mov eax,hEditl if hCtl = eax

.if numl == 0

mov ebx,wParam and ebx,Ofh mov numl,ebx else

mov eax,numl mov bx,10

mul Ьх

mov ebx,wParam and bx,Ofh add ax,bx mov numl, eax endif elseif

.if num2 = 0

mov ebx,wParam and ebx,Ofh mov num2 , ebx else

mov eax,num2 mov bx,10 mul bx

mov ebx,wParam and bx,Ofh add ax,bx mov num2,eax endif endif endif accept:

invoke CallWindowProc,lpfnEdlProc,hCtl,uMsg, wParam,lParam ret EdlProc endp end start

Створення бібліотеки MyDlldll здійснюється при запуску bat-файла види:

@echo  off

if exist MyDllobj del MyDllobj

if exist MyDlldll del MyDlldll

d:\masm32\bin\ml /c /coff MyDllasm

d:\masm32\bin\Link /SUBSYSTEM:WINDOWS /DLL

/DEF:MyDlldef MyDllobj

pause

Створення виконуваного файлу здійснюється при запуску bat-файлу: @ echo off

if exist MyCallDllobj del MyCallDllobj if exist MyCallDllexe del MyCallDllexe if exist rsrcres del rsrcres

if exist rsrcobj del rsrcobj

d:\masm3 2\BIN\Rc Exe / v rs reгс

d:\masm32\BIN\Cvtresexe /machine:ix86 rsrcres

d:\masm32\bin\ml /c /coff MyCallDllasm

d:\masm32\bin\linkexe /SUBSYSTEM:WINDOWS MyCallDllobj

rsrcobj

pause

Приклад роботи програми наведений на малюнку 35

Малюнок 35

Джерело: Сучкова, ЛІ Win32 API: основи програмування: навчальний посібник / ЛІ Сучкова АлтГТУ ім ШІ Ползунова -Барнаул, АлтГТУ, 2010 138 с, іл

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*