老文章档案 · 2003 年

建立自己的动态链接库

网络学院 · 破解文章 · 2003-09-19 · 作者:怜香 · 出处:赢政天下整理收藏

现在编程序,不用说,都是在调用别人做好的动态链接库中的函数,能不能编写自己的动态链接库呢?答案是肯定的!让我们开始吧!

;-------------------------------------------------------

;例:将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,对吗?

相关资讯:

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)|

广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright (C) 1998-2004 winzheng.com All Rights Reserved.

特别感谢 蓝芒科技 提供下载站及论坛服务器

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史