
Приложение 6
dll4.asm
.386P
; плоская модель
.MODEL FLAT, stdcall
PUBLIC DLLP4
; прототипы внешних процедур
EXTERNMessageBoxA@16:NEAR
; директивы компоновщику для подключения библиотек
includelibc:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
;--------------------------------------------------
; сегмент данных
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
TEXTDB"В динамической библиотеке",0
MSDB"Сообщение",0
_DATAENDS
; сегмент кода
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
; [EBP+10H] ; резервный параметр
; [EBP+0CH] ; причина вызова
; [EBP+8] ; идентификаторDLL-модуля
DLLENTRY:
MOVEAX,1
RET12
;------------------
;адреса параметров
DLLP4 PROC EXPORT
PUSH EBP
MOV EBP,ESP
PUSH 0
PUSH OFFSET MS
PUSH OFFSET TEXT
PUSH0
CALLMessageBoxA@16
; изменим строку, расположенную в разделяемой памяти
MOV TEXT,'И'
MOV TEXT+1,'з'
POP EBP
RET
DLLP4 ENDP
_TEXT ENDS
END DLLENTRY
dllex4.asm
.386P
; плоская модель
.MODEL FLAT, stdcall
; константы
; прототипы внешних процедур
EXTERN GetProcAddress@8:NEAR
EXTERN LoadLibraryA@4:NEAR
EXTERN FreeLibrary@4:NEAR
EXTERN ExitProcess@4:NEAR
EXTERNMessageBoxA@16:NEAR
; директивы компоновщику для подключения библиотек
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
;----------------------------------
; сегмент данных
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
TXTDB'Ошибка динамической библиотеки',0
MSDB'Сообщение',0
LIBRDB'DLL4.DLL',0
HLIB DD ?
NAMEPROC DB '_DLLP4@0',0
_DATA ENDS
; сегмент кода
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
; [EBP+10H] ; резервный параметр
; [EBP+0CH] ; причина вызова
; [EBP+8] ; идентификаторDLL-модуля
START:
; загрузить библиотеку
PUSH OFFSET LIBR
CALL LoadLibraryA@4
CMP EAX,0
JE _ERR
MOV HLIB,EAX
; получить адрес
PUSH OFFSET NAMEPROC
PUSH HLIB
CALL GetProcAddress@8
CMP EAX,0
JNE YES_NAME
; сообщение об ошибке
_ERR:
PUSH0
PUSH OFFSET MS
PUSH OFFSET TXT
PUSH 0
CALL MessageBoxA@16
JMP _EXIT
YES_NAME:
CALL EAX
PUSH 0
PUSH OFFSET MS
PUSH OFFSET MS
PUSH0
CALLMessageBoxA@16
; закрыть библиотеку
; библиотека автоматически закрывается также
; при выходе из программы
PUSHOFFSETNAMEPROC
PUSH HLIB
CALL FreeLibrary@4
; выход
_EXIT:
PUSH 0
CALL ExitProcess@4
_TEXT ENDS
END START