
Приложение 2
dllex.asm
.386P
; плоская модель
.MODEL FLAT, stdcall
; константы
; прототипы внешних процедур
EXTERNGetProcAddress@8:NEAR
EXTERN LoadLibraryA@4:NEAR
EXTERN FreeLibrary@4:NEAR
EXTERN ExitProcess@4:NEAR
EXTERN MessageBoxA@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'DLL1.DLL',0
HLIB DD ?
NAMEPROC DB '_DLLP1@0',0
_DATA ENDS
; сегмент кода
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
; загрузить библиотеку
PUSH OFFSET LIBR
CALL LoadLibraryA@4
CMP EAX,0
JE _ERR
MOVHLIB,EAX
; получить адрес процедуры
PUSH OFFSET NAMEPROC
PUSH HLIB
CALL GetProcAddress@8
CMP EAX,0
JNEYES_NAME
; сообщение об ошибке
_ERR:
PUSH 0
PUSH OFFSET MS
PUSH OFFSET TXT
PUSH 0
CALL MessageBoxA@16
JMP _EXIT
YES_NAME:
PUSH1 ; параметр
CALLEAX
; закрыть библиотеку
PUSHHLIB
CALLFreeLibrary@4
; библиотека автоматически закрывается также
; при выходе из программы
; выход
_EXIT:
PUSH 0
CALL ExitProcess@4
_TEXT ENDS
END START
Приложение 3
dllex1.asm
.386P
; плоская модель
.MODEL FLAT, stdcall
; константы
; прототипы внешних процедур
includelib dll1.lib
EXTERN DLLP1@0:NEAR
EXTERN ExitProcess@4:NEAR
; директивы компоновщику для подключения библиотек
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
;-----------------------------------------------------
; сегмент данных
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
_DATA ENDS
; сегмент кода
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
PUSH 1 ; параметр
CALL DLLP1@0
; выход
_EXIT:
PUSH 0
CALL ExitProcess@4
_TEXT ENDS
END START
Приложение 4
dll2.asm
.386P
; плоская модель
.MODEL FLAT, stdcall
PUBLIC DLLP2
; константы
; сообщения, приходящие при открытии
; динамической библиотеки
DLL_PROCESS_DETACH equ 0
DLL_PROCESS_ATTACH equ 1
DLL_THREAD_ATTACH equ 2
DLL_THREAD_DETACH equ 3
; прототипы внешних процедур
EXTERN MessageBoxA@16:NEAR
; директивы компоновщику для подключения библиотек
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
;--------------------------------------------------
; сегмент данных
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
TEXT DB "Строка в динамической библиотеке",0
_DATA ENDS
; сегмент кода
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
; [EBP+10H] ; резервный параметр
; [EBP+0CH] ; причина вызова
; [EBP+8] ; идентификатор DLL-модуля
DLLENTRY:
MOV EAX,DWORD PTR [EBP+0CH]
CMP EAX,0
JNE D1
; закрытие библиотеки
JMP _EXIT
D1:
CMPEAX,1
JNE _EXIT
; открытие библиотеки
_EXIT:
MOV EAX,1
RET 12
;---------------------
; адреса параметров
; [EBP+8]
; [EBP+0CH]
DLLP2 PROC EXPORT
PUSH EBP
MOV EBP,ESP
PUSH 0
PUSH DWORD PTR [EBP+0CH]
PUSH DWORD PTR [EBP+8]
PUSH 0
CALL MessageBoxA@16
POP EBP
LEA EAX,TEXT
RET 8
DLLP2 ENDP
_TEXT ENDS
END DLLENTRY
dllex2.asm
.386P
; плоская модель
.MODEL FLAT, stdcall
; константы
; прототипы внешних процедур
EXTERNGetProcAddress@8:NEAR
EXTERN LoadLibraryA@4:NEAR
EXTERN FreeLibrary@4:NEAR
EXTERN ExitProcess@4:NEAR
EXTERN MessageBoxA@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'DLL2.DLL',0
HLIBDD?
MS1DB'Сообщение из библиотеки',0
TEXTDB'Строка содержится в основном модуле',0
NAMEPROC DB '_DLLP2@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
JNEYES_NAME
; сообщение об ошибке
_ERR:
PUSH 0
PUSH OFFSET MS
PUSH OFFSET TXT
PUSH 0
CALL MessageBoxA@16
JMP _EXIT
YES_NAME:
PUSH OFFSET MS1
PUSH OFFSET TEXT
CALL EAX
PUSH 0
PUSH OFFSET MS
PUSH EAX
PUSH 0
CALL MessageBoxA@16
; закрыть библиотеку
PUSH HLIB
CALL FreeLibrary@4
; библиотека автоматически закрывается также
; при выходе из программы
; выход
_EXIT:
PUSH 0
CALL ExitProcess@4
_TEXT ENDS
END START