Ассемблер для Windows



         

Основной модуль и динамическая библиотека Передача параметров



Рисунок 3.3.5. Основной модуль и динамическая библиотека. Передача параметров.

Трансляция программы на Рисунок 3.3.5.

MASM32.

ml /c /coff /DMASM dllex2.asm link /subsystem:windows dllex2.obj

TASM32.

tasm32 /ml dllex2.asm tlink32 -aa -Tpd dllex2.obj

Ниже мы рассмотрим весьма интересный пример (Рисунок 3.3.6). Основной процесс использует ресурсы загруженной им динамической библиотеки. Я уже говорил, что файлы шрифтов, по сути, являются динамическими библиотеками. Не правда ли удобно: ресурсы можно поместить отдельно от основной программы в динамическую библиотеку, загружая их по мере необходимости? Наша программа вначале загружает иконку из ресурсов динамической библиотеки и устанавливает ее на окно. Если Вы будете щелкать правой кнопкой мыши, направив курсор на окно, то будет вызываться процедура из динамической библиотеки, которая будет поочередно устанавливать то один, то другой значок на окно.

// файл dll3.rc // идентификаторы

#define IDI_ICON1 3 #define IDI_ICON2 10

// определили иконку IDI_ICON1 ICON "ico1.ico" IDI_ICON2 ICON "ico2.ico"

; динамическая библиотека DLL3.ASM .386P PUBLIC SETIC ; плоская модель IFDEF MASM .MODEL FLAT, stdcall ELSE .MODEL FLAT ENDIF

; константы WM_SETICON equ 80h

IFDEF MASM ; MASM ; прототипы внешних процедур EXTERN LoadIconA@8:NEAR EXTERN PostMessageA@16:NEAR ; директивы компоновщику для подключения библиотек includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib ELSE ; TASM ; прототипы внешних процедур EXTERN LoadIconA:NEAR EXTERN PostMessageA:NEAR ; директивы компоновщику для подключения библиотек includelib c:\tasm32\lib\import32.lib LoadIconA@8 = LoadIconA PostMessageA@16 = PostMessageA ENDIF ;-------------------------------------------------

; сегмент данных _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 MOV EBP,ESP ; выбрать, какую иконку устанавливать CMP PRIZ,0 JZ IC_1 MOV PRIZ,0 PUSH 3 JMP CONT IC_1: MOV PRIZ,1 PUSH 10 CONT: ; загрузить иконку из ресурсов библиотеки PUSH DWORD PTR [EBP+0CH] ; идентификатор ; динамической ; библиотеки CALL LoadIconA@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




Содержание  Назад  Вперед