Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчеты по Курсовой Работе / Динамические библиотеки, 8-78-2, Блинов И.А..docx
Скачиваний:
40
Добавлен:
12.03.2015
Размер:
183.39 Кб
Скачать
    1. Приложение 5

dll3.asm

.386P

PUBLIC SETIC

; плоская модель

.MODELFLAT,stdcall

; константы

WM_SETICONequ80h

; прототипы внешних процедур

EXTERN LoadIconA@8:NEAR

EXTERN PostMessageA@16:NEAR

; директивы компоновщику для подключения библиотек

includelib c:\masm32\lib\user32.lib

includelib c:\masm32\lib\kernel32.lib

;-------------------------------------------------

; сегмент данных

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'

PRIZ DB 0

_DATA ENDS

; сегмент кода

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

DLLENTRY:

MOV EAX,1

RET 12

; [EBP+8]

; [EBP+0CH]

SETIC PROC EXPORT

PUSH EBP

MOVEBP,ESP

; выбрать, какую иконку устанавливать

CMP PRIZ,0

JZ IC_1

MOV PRIZ,0

PUSH 3

JMP CONT

IC_1:

MOVPRIZ,1

PUSH10

CONT:

; загрузить иконку из ресурсов библиотеки

PUSHDWORDPTR[EBP+0CH] ; идентификатор

; динамической

; библиотеки

CALLLoadIconA@8

; установить значок окна

PUSH EAX

PUSH 0

PUSH WM_SETICON

PUSH DWORD PTR [EBP+08H] ; дескриптор окна

CALL PostMessageA@16

POP EBP

RET 8

SETIC ENDP

_TEXT ENDS

END DLLENTRY

dll3.rc

#define IDI_ICON1 3

#define IDI_ICON2 10

IDI_ICON1 ICON "ico1.ico"

IDI_ICON2 ICON "ico2.ico"

dllex3.rc

#define WS_SYSMENU 0x00080000L

#define WS_MINIMIZEBOX 0x00020000L

#define WS_MAXIMIZEBOX 0x00010000L

#define DS_3DLOOK 0x0004L

DIAL1DIALOG0, 0, 340, 120

STYLE WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | DS_3DLOOK

CAPTION"Диалоговое окно с иконкой из динамической библиотеки"

FONT 8, "Arial"

{

}

dllex3.asm

.386P

; плоская модель

.MODEL FLAT, stdcall

; константы

; сообщение приходит при закрытии окна

WM_CLOSE equ 10h

WM_INITDIALOG equ 110h

WM_SETICON equ 80h

WM_LBUTTONDOWN equ 201h

; прототипы внешних процедур

EXTERN PostMessageA@16:NEAR

EXTERN GetProcAddress@8:NEAR

EXTERN LoadLibraryA@4:NEAR

EXTERN FreeLibrary@4:NEAR

EXTERN ExitProcess@4:NEAR

EXTERN GetModuleHandleA@4:NEAR

EXTERN DialogBoxParamA@20:NEAR

EXTERN EndDialog@8:NEAR

EXTERN LoadIconA@8:NEAR

; директивы компоновщику для подключения библиотек

includelib c:\masm32\lib\user32.lib

includelib c:\masm32\lib\kernel32.lib

;------------------------------------------------

; сегмент данных

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'

LIBR DB 'DLL3.DLL',0

HLIB DD ?

HINST DD ?

PA DB "DIAL1",0

NAMEPROC DB "_SETIC@0",0

_DATA ENDS

; сегмент кода

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

START:

; получить дескриптор приложения

PUSH 0

CALL GetModuleHandleA@4

; создать диалог

MOV [HINST], EAX

PUSH 0

PUSH OFFSET WNDPROC

PUSH 0

PUSH OFFSET PA

PUSH [HINST]

CALL DialogBoxParamA@20

; выход

_EXIT:

PUSH 0

CALL ExitProcess@4

; процедура окна

; расположение параметров в стеке

; [EBP+014Н] ; LPARAM

; [EBP+10Н] ; WAPARAM

; [EBP+0CH] ; MES

; [EBP+8] ; HWND

WNDPROC PROC

PUSH EBP

MOV EBP,ESP

PUSH EBX

PUSH ESI

PUSH EDI

;-------------------

CMP DWORD PTR [EBP+0CH],WM_CLOSE

JNE L1

; закрыть библиотеку

; библиотека автоматически закрывается также

; при выходе из программы

PUSH HLIB

CALL FreeLibrary@4

PUSH 0

PUSH DWORD PTR [EBP+08H]

CALL EndDialog@8

JMP FINISH

L1:

CMP DWORD PTR [EBP+0CH],WM_INITDIALOG

JNE L2

; загрузить библиотеку

PUSH OFFSET LIBR

CALL LoadLibraryA@4

MOV HLIB,EAX

; загрузить иконку

PUSH 3 ; идентификатор иконки

PUSH [HLIB] ; идентификатор процесса

CALL LoadIconA@8

; установить иконку

PUSH EAX

PUSH 0 ; тип иконки (маленькая)

PUSH WM_SETICON

PUSH DWORD PTR [EBP+08H]

CALL PostMessageA@16

JMP FINISH

L2:

CMP DWORD PTR [EBP+0CH],WM_LBUTTONDOWN

JNE FINISH

; получить адрес процедуры из динамической библиотеки

PUSH OFFSET NAMEPROC

PUSH HLIB

CALL GetProcAddress@8

; вызвать процедуру с двумя параметрами

PUSH [HLIB]

PUSH DWORD PTR [EBP+08H]

CALL EAX

FINISH:

POP EDI

POP ESI

POP EBX

POP EBP

MOV EAX,0

RET 16

WNDPROC ENDP

_TEXT ENDS

END START