
Приложение 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