現在編程序,不用說,都是在調用別人做好的動態鏈接庫中的函數,能不能編寫自己的動態鏈接庫呢?答案是肯定的!讓我們開始吧!
;-------------------------------------------------------
;例:將EDX:EAX中的值轉換成十進制輸出形式字符串。
;文件名:MyDll.asm,這是動態鏈接庫的源程序
;編譯模式="DLL" ;這是AoGo的最新版本MASM for EditPlus的要求,只需指明編譯模式,則都只需要按Ctrl+1就能編譯所有的模式,真是方便.
.386
.model flat,stdcall
option casemap:none
include windows.inc
.code
;DllEntry是動態鏈接庫的入口,當動態鏈接庫被加載/卸載時,或同一進程的線程生成/退出時,都會調用該入口函數
;當然,函數名不一定非是這個,但要和最後的End DllEntry保持一致。
DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax,TRUE ;若返回FALSE,動態鏈接庫就不會加載了
ret
DllEntry Endp
;將EDX:EAX中的值轉換成十進制輸出形式字符串,很熟悉吧,前面的例子中有的!
OutEdxEax proc \ ;比如:EDX=0,EAX=01234567H,則轉換後的字符串為:
uses ebx esi edi,lpString ; -> '19088743',0
mov edi,lpString ;指向存放結果的地址
mov esi,lpString
mov ecx,10 ;轉換成十進制
.while eax!=0 || edx!=0
push eax
mov eax,edx
xor edx,edx
div ecx
mov ebx,eax
pop eax
div ecx
add dl,'0'
mov [edi],dl ;存放結果
inc edi
mov edx,ebx
.endw
mov BYTE ptr [edi],0;字符串以0為結尾
dec edi
.while edi>esi ;結果前變後,後變前!
mov al,[esi]
xchg al,[edi]
mov [esi],al
inc esi
dec edi
.endw
ret
OutEdxEax endp
end DllEntry
-------------------------------------------------------------------
;文件名:Mydll.def,要和MyDll.asm保存在相同的目錄下
;模塊定義文件,定義能被其它程序調用的函數名
LIBRARY MyDll ;動態鏈接庫的名字
EXPORTS OutEdxEax ;可被調用的函數名
-------------------------------------------------------------------
;文件名:MyDll.inc,函數聲明
OutEdxEax PROTO :DWORD ;一個緩沖區指針參數,用來存放轉換後的子符串,注意緩沖區要足夠存放結果。
-------------------------------------------------------------------
編譯鏈接:
用EditPlus打開文件MyDll.asm,執行“工具\編譯&鏈接&運行”或直接用“Ctrl+1”,只要程序沒輸入錯,就可看到編譯後生成的文件。如下:
D:\MASM7>dir mydll
Volume in drive D has no label
Volume Serial Number is 18F0-186B
Directory of D:\MASM7
MYDLL ASM 1,675 02-17-03 21:12 MyDll.asm
MYDLL DEF 36 02-17-03 20:48 MyDll.def
MYDLL INC 28 02-17-03 21:28 MyDll.inc
MYDLL DLL 2,560 02-17-03 20:49 MyDll.DLL
MYDLL LIB 2,064 02-17-03 20:49 MyDll.lib
MYDLL EXP 516 02-17-03 20:49 MyDll.exp
6 file(s) 6,879 bytes
0 dir(s) 2,398,564,352 bytes free
注意:將mydll.inc拷貝到\masm32\include目錄下,將mydll.lib拷貝到\masm32\lib目錄下,將mydll.dll拷貝到和程序相同的目錄下或...。
-------------------------------------------------------------------
調用生成的動態鏈接庫,看看效果怎麼樣吧!
;例:文件名:10.asm
;調用MyDll.dll,看能否正常工作
.386
.model flat,stdcall
option casemap:none
include windows.inc
include mydll.inc
include masm32.inc
include kernel32.inc
includelib mydll.lib
includelib masm32.lib
includelib kernel32.lib
.data?
CharOut db 100 dup(?)
.code
start:
mov edx,12345678h
mov eax,87654321h
invoke OutEdxEax,addr CharOut ;用我們自己的程序轉換!
invoke StdOut,addr CharOut
invoke ExitProcess,NULL
end start
用EditPlus打開文件10.asm,執行“工具\編譯&鏈接&運行”或直接用“Ctrl+1”,就可看到執行的結果:1311768467139281697,對嗎?