Приклад 2.

Нехай дано три числа Напишемо функції для розрахунку середнього арифметичного, твори, суми квадратів чисел, а також для перевірки, чи є 2 і 3 числа дільниками першого Всі дії з числами оформимо у вигляді меню, яке опишемо в файлі ресурсів:

500 ICON MOVEABLE PUKE LOADONCALL DISCARDABLE

&quotMAINICONICO&quot 600 MENUEX MOVEABLE IMPURE LOADONCALL DISCARDABLE BEGIN

POPUP (Функції,,, 0 BEGIN

MENUITEM & Подільники, 2000 MENUITEM & Середнє арифм, 2100 MENUIТЕМ (Множення, 2200 MENUITEM & Сума квадратів, 2300 MENUIТЕМ & Очистити, 2400 MENUITEM & Вихід, 1000 END END

Вихідні числа і результати розрахунків будемо розміщати в рядки редагування елементів Edifflox, тому в якості параметрів функції DLL отримуватимуть дескриптори цих елементів Назвемо нашу бібліотеку tstdll Її опис у файлі tstdlldef має вигляд:

LIBRARY  tstdll

EXPORTS  Deliteli

EXPORTS  SrArifm

EXPORTS  FindMult

EXPORTS  FindMultSqr

Текст, що містить опис функцій бібліотеки, наведено нижче

.model flat, stdcall

option casemap :none

include d:\masm32\include\windowsinc

include d:\masm32\include\user32inc

include d:\masm32\include\kernel32inc

include d:\masm32\include\masm32inc

includelib d:\masm32\lib\masm32lib

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 data

buff db 50 dup (0) буфер для перетворення числа в рядок code LibMain proc hlnstDLL: DWORD, reason: DWORD,

unused:DWORD szText LmTitle,&quottstdlls LibMain Function&quot

.if reason == DLL_PROCESS_ATTACH return TRUE

.endif ret LibMain Endp

; функція, яка отримує три числа з рядків редагування елементів EditBox з дескрипторами hEl, hE2, hE3, що перевіряє чи є друге і третій числа дільниками першого і видає повідомлення про результати перевірки Deliteli proc hE1: DWORD, hE2: DWORD, hE3: DWORD

LOCA1 chislol: DWORD число 1

LOCA1 chislo2: DWORD число 2

LOCA1 chislo3: DWORD число 3

LOCA1 flagl: DWORD LOCA1 flag2: DWORD допоміжні прапори для запамятовування результатів перевірки на подільність

invoke SendMessage, hEl, WM_GETTEXT, 50, addr buff забрати рядок з EditBox для першого числа і помістити в buff

invoke atodw, addr buff перетворити рядок з buff в число, що записується в регістр ЕАХ

mov chislol, ЕАХ запамятати перше число в chislol

; аналогічні дії з другим і третім числом invoke SendMessage, hE2, WM_GETTEXT, 50, addr buff invoke atodw, addr buff mov chislo2, eax

invoke SendMessage, hE3,WM_GETTEXT,50,addr buff invoke atodw,addr buff mov chislo3,eax if chislol = 0 szText Msg,

“Число одно 0 У нього немає ненульових дільників” szText Ttil, Рішення

invoke MessageBox,NULL,addr Msg,addr Ttll,MB_OK else

.if chislo2 = 0

szText Msg2, Друге число дорівнює О” s z Text Ttl2, Рішення

invoke MessageBox,NULL,addr Msg2,addr Ttl2, MB_OK else

mov flagl,0

mov eax,ch±slol

mov ebx,ch±slo2

cdq

div ebx

.if edx == 0

mov flagl,1 endif mov flag2,0 if chislo3 == 0

szText Msg3, Друге число дорівнює О” szText Ttl3, Рішення invoke MessageBox, NULL, addr Msg3, addr Ttl3, MB_OK else

mov eax,chislol

mov ebx,chislo3

cdq

div ebx

.if edx = 0

mov flag2,1 endif endif

.if flagl == 1 if flag2 == 1

szText Msg4, 06a числа явл дільниками” szText Ttl4, Рішення invoke MessageBox, NULL, addr Msg4, addr Ttl4, MB_OK else

szText Msg5, Тільки друге число дільник” s z Text Ttl5, Рішення invoke MessageBox, NULL, addr Msg5, addr Ttl5, MB_OK endif else

.if flag2 == 1

szText Msg6, Тільки третє число дільник” s z Text Ttl6, Рішення invoke MessageBox, NULL, addr Msg6, addr Ttl6, MB_OK else

szText Msg7, Числа НЕ явл дільниками” szText Ttl7 / Рішення invoke MessageBox, NULL, addr Msg7, addr Ttl7, MB_OK endif endif

.endif

.endif

ret Deliteli endp

; функція, що знаходить середнє арифметичне трьох чисел з рядків редагування трьох елементів EditBox і що виводить результат в четвертий EditBox SrArifm proc hEl: DWORD, hE2: DWORD, hE3: DWORD, hE4: DWORD

LOCA1 chislol:DWORD

LOCA1 chislo2: DWORD

LOCA1 chislo3:DWORD

LOCA1 rezult:DWORD

invoke SendMessage, hEl,WM_GETTEXT,50,addr buff

invoke atodw,addr buff

mov chislol,eax

invoke SendMessage, hE2,WM_GETTEXT,50,addr buff

invoke atodw,addr buff

mov chislo2,eax

invoke SendMessage, hE3,WM_GETTEXT,50,addr buff

invoke atodw,addr buff

mov chislo3,eax

mov eax,chislol

mov edx,chislo2

add eax,edx

mov edx,chislo3

add eax,edx

mov ebx,3

cdq

idiv ebx

mov rezult,eax

invoke dwtoa,rezult,addr buff

invoke SendMessage, hE4, WM_SETTEXT, 0, addr buff запис рядки з buff в рядок редагування однострочного редактора з дескриптором hE4

ret SrArifm endp

; функція для пошуку твору трьох чисел з рядків редагування трьох елементів EditBox і що виводить результат в четвертий EditBox FindMult proc hEl: DWORD, hE2: DWORD, hE3: DWORD, hE4: DWORD

LOCA1 chislol:DWORD

LOCA1 chislo2: DWORD

LOCA1 chislo3:DWORD

LOCA1 rezult:DWORD

invoke SendMessage, hEl,WM_GETTEXT,50,addr buff

invoke atodw,addr buff

mov chislol,eax

invoke SendMessage, hE2,WM_GETTEXT,50,addx buff

invoke atodw,addr buff

mov chislo2,eax

invoke SendMessage, hE3,WM_GETTEXT,50,addx buff

invoke atodw,addr buff

mov chislo3,eax

mov eax,chislol

mov ebx,chislo2

mov ecx,chislo3

imul ebx

imul ecx

mov rezult,eax

invoke dwtoa,rezult,addx buff

invoke  SendMessage,hE4,WM_SETTEXT,0,addr buff

ret FindMult endp

; функція для знаходження суми квадратів трьох чисел з рядків редагування трьох елементів EditBox і що виводить результат в четвертий EditBox FindMultSqr proc hEl: DWORD, hE2: DWORD, hE3: DWORD, hE4: DWORD

LOCA1 chislol:DWORD

LOCA1 chislo2:DWORD

LOCA1 chislo3:DWORD

LOCA1 rezult:DWORD

LOCA1 kvl:DWORD

LOCA1 kv2:DWORD

LOCA1 kv3:DWORD

invoke SendMessage, hEl,WM_GETTEXT,50,addx buff

invoke atodw,addr buff

mov chislol,eax

invoke SendMessage, hE2,WM_GETTEXT,50,addx buff

invoke atodw,addr buff

mov chislo2,eax

invoke SendMessage, hE3,WM_GETTEXT,50,addx buff

invoke atodw,addr buff

mov chislo3,eax

mov eax,chislol

imul eax

mov kvl,eax

mov eax,chislo2

imul eax

mov kv2,eax

mov eax,chislo3

imul eax

mov kv3,eax

mov eax,kvl

mov ebx,kv2

add eax,ebx

mov ebx,kv3

add eax,ebx

mov rezult,eax

invoke dwtoa,rezult,addr buff

invoke  SendMessage,hE4,WM_SETTEXT,0,addr buff

ret FindMultSqr endp End LibMain

Текст, що містить виклик функцій бібліотеки, наведено нижче

.model flat, stdcall

option casemap :none

include d:\masm32\include\windowsinc

include d:\masm32\include\user32inc

include d:\masm32\include\masm32inc

include d:\masm32\include\kernel32inc

includelib d:\masm32\lib\masm32lib

includelib d:\masm32\lib\user32lib

includelib d:\masm32\lib\kernel32lib

includelib tstdlllib

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

DWORD,:DWORD, DWORD,:DWORD, DWORD,:DWORD, DWORD,:DWORD :DWORD,:DWORD, DWORD,:DWORD,: :DWORD,:DWORD,:DWORD,:DWORD FindMultSqr PROTO :DWORD,:DWORD,:DWORD,:DWORD data

DWORD,

:DWORD

DWORD,

:DWORD

DWORD,

:DWORD,

:DWORD,

:DWORD

DWORD,

:DWORD

Deliteli PROTO SrArifm PROTO FindMult PROTO

WinMain PROTO WndProc PROTO EditSl PROTO

szDisplayName db DLL-функції, 0 CommandLine dd 0 hWnd dd 0 hlnstance dd 0 nulbyte db 0 hEditl DWORD 0 hEdit2 DWORD 0 hEdit3 DWORD 0 hEdit4 DWORD 0 hEdit5 DWORD 0 hEdit6 DWORD 0 buff db 50 dup(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

szText szClassName,&quotMyClass&quot

invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW, ADDR szClassName, ADDR szDisplayName, WS_OVERLAPPEDWINDOW, 0,0,480,480, NULL,NULL, hInst,NULL mov hWnd,eax

invoke LoadMenu,hInst,600 invoke SetMenu,hWnd,eax invoke ShowWindow,hWnd,SW_SHOWNORMAL invoke UpdateWindow,hWnd StartLoop: invoke GetMessage,ADDR msg,NULL,0,0 cnp 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 LOCAL nol:DWORD if uMsg == WM_COMMAND if wParam == 1000

invoke SendMessage,hWin,WM_SYSCOMMAND, SC_CLOSE, NULL elseif wParam == 2000

invoke Deliteli,hEditl,hEdit2,hEdit3 elseif wParam == 2100

invoke SrArifm, hEditl, hEdit2, hEdit3, hEdit4 результат обчислення середнього арифметичного в четвертий EditBox

.elseif wParam == 2200

invoke FindMult, hEditl, hEdit2, hEdit3, hEdit5 результат обчислення добутку трьох чисел – в пятий EditBox

.elseif wParam == 2300

invoke FindMultSqr, hEditl, hEdit2, hEdit3, hEdit6 результат обчислення суми квадратів трьох чисел – в шостий EditBox

. Elseif wParam == 2400 очищення всіх елементів EditBox mov nol, 0

invoke dwtoa,nol,addr buff

invoke SendMessage, hEditl,WM_SETTEXT,0,

addr buff invoke SendMessage, hEdit2,WM_SETTEXT,0,

addr buff invoke SendMessage, hEdit3,WM_SETTEXT,0,

addr buff invoke SendMessage, hEdit4,WM_SETTEXT,0,

addr buff invoke SendMessage, hEdit5,WM_SETTEXT,0,

addr buff invoke SendMessage, hEdit6,WM_SETTEXT,0, addr buff endif elseif uMsg == WM_CREATE

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

invoke EditSl,ADDR nulbyte,100,50,50,23,hWin,200 mov hEdit2, eax

invoke EditSl,ADDR nulbyte,100,90,50,23,hWin,200 mov hEdit3, eax

invoke EditSl,ADDR nulbyte,160,10,50,23,hWin,200 mov hEdit4, eax

invoke EditSl,ADDR nulbyte,160,50,50,23,hWin,200 mov hEdit5, eax

invoke EditSl,ADDR nulbyte,160,90,50,23,hWin,200 mov hEdit6, eax elseif uMsg == WM_DESTROY

invoke PostQuitMessage,NULL return 0 endif

invoke DefWindowProc, hWin, uMsg, wParam, lParam ret WndProc 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 end start

&nbsp

Джерело: Сучкова, ЛІ 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>

*

*