city

数字城市

21 成员272 主题84 回复0 张照片

宏汇编怎么写DLL

海
海外黑风吹海立
2000-10-12 13:16
这是masm的一个例子
tstdll.asm
; #########################################################################
;
; Build this DLL from the batch file called BldDLL.bat
;
; #########################################################################

.386
.model flat, stdcall
option casemap :none ; case sensitive

; #########################################################################

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

; #########################################################################

szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM

m2m MACRO M1, M2
push M2
pop M1
ENDM

return MACRO arg
mov eax, arg
ret
ENDM

.code

; ##########################################################################

LibMain proc hInstDLL:DWORD, reason:DWORD, unused:DWORD

szText LmTitle,"tstdll's LibMain Function"

.if reason == DLL_PROCESS_ATTACH
szText ATTACHPROCESS,"PROCESS_ATTACH"
invoke MessageBox,NULL,ADDR ATTACHPROCESS,addr LmTitle,MB_OK

return TRUE
; -----------------------------
; If error at startup, return 0
; System will abort loading DLL
; -----------------------------

.elseif reason == DLL_PROCESS_DETACH
szText DETACHPROCESS,"PROCESS_DETACH"
invoke MessageBox,NULL,addr DETACHPROCESS,addr LmTitle,MB_OK

.elseif reason == DLL_THREAD_ATTACH
szText ATTACHTHREAD,"THREAD_ATTACH"
invoke MessageBox,NULL,addr ATTACHTHREAD,addr LmTitle,MB_OK

.elseif reason == DLL_THREAD_DETACH
szText DETACHTHREAD,"THREAD_DETACH"
invoke MessageBox,NULL,addr DETACHTHREAD,addr LmTitle,MB_OK

.endif

ret

LibMain Endp

; ##########################################################################

TestProc proc

jmp @F
MbTitle db "Test function",0
MbMsg db "This is tstdll.dll here",0
@@:

invoke MessageBox,NULL,addr MbMsg,addr MbTitle,MB_OK

ret

TestProc endp

; ##########################################################################

End LibMain

再就是一个blddll.bat文件
@echo off

if exist tstdll.obj del tstdll.obj
if exist tstdll.dll del tstdll.dll

\masm32\bin\ml /c /coff tstdll.asm

\masm32\bin\Link /SUBSYSTEM:WINDOWS /DLL /DEF:tstdll.def tstdll.obj

dir tstdll.*

pause

1 / 1

登录后回复。