DLL简述,很有意思
转自https://blog.csdn.net/swort_177/article/details/5426848
在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库。现在就让我们走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧!
初窥门径:Windows的基石
随便打开一个系统目录,一眼望去就能看到很多扩展名DLL的文件,这些就是经常说的“动态链接库”,DLL是Dynamic Link Library(即“动态链接库”)的缩写。从Microsoft公司推出首个版本的Windows以来,动态链接库就一直是这个操作系统的基础。
1.看看DLL里有什么
与其用晦涩的专业术语来解决DLL是什么,不如先来看看DLL里有什么。DLL和EXE文件一样,其中包含的也是程序的二进制执行代码和程序所需的资源(比如图标、对话框、字符串等),可是为什么要把代码放在DLL里面,而不是做成EXE呢?其实DLL中的代码是以API函数形式出现的,通俗地说,DLL中包含的程序代码都被做成了一个个小模块,应用程序通过按下所需DLL中特定的按钮,来调用DLL中这个按钮所代表的功能。在使用“记事本”等程序时,如果要保存文件或打开文件,就会弹出通用文件对话框,让我们选择文件位置。你可知道,这就是调用了系统底层DLL中的通用对话框界面。
2.系统中几个重要的DLL
Windows中有3个非常重要的底层DLL:Kernel32.dll、User32.dll、GDI32.dll。其中Kernel32.dll顾名思义就是内核相关的功能,主要包含用于管理内存、进程和线程的函数;而User32.dll中包含的则是用于执行用户界面任务的函数,比如把用户的鼠标点击操作传递给窗口,以便窗口根据用户的点击来执行预定的事件;GDI32.dll的名称用了缩写,全称是Graphical Device Interface(图形设备接口),包含用于画图和显示文本的函数,比如要显示一个程序窗口,就调用了其中的函数来画这个窗口。
3.为什么要用DLL
刚才在谈到这个问题的时候,我们只是解释了DLL将程序代码封装成函数的原理。为什么封装成函数,就能成为系统中大量使用DLL的理由呢?
①扩展应用程序
由于DLL能被应用程序动态载入内存。所以,应用程序可以在需要时才将DLL载入到内存中,这让程序的可维护性变得很高。比如QQ的视频功能需要升级,那么负责编写QQ的程序员不必将QQ所有代码都重写,只需将视频功能相关的DLL文件重写即可。
②便于程序员合作
这个和我们最终用户关系不大,仅供了解。我们都知道编程工具有很多,比如VB、VC、Delphi等,如果好几个人合作来编写一个大的程序,那么可能有的人用VB,有的人用VC,每人负责的部分所使用的编程语言都不同,究竟放在哪个编译器中进行编译呢?这就好比一群来自各个国家的人在共同编写一篇文章,如果他们所使用的语言都不同,写出来的文章怎么可能凑到一起呢?而有了DLL后,可以让VC程序员写一个DLL,然后VB程序员在程序中调用,无需为怎么将它们都编译为一个单独的EXE而发愁了。
③节省内存
如果多个应用程序调用的是同一个动态链接库,那么这个DLL文件不会被重复多次装入内存中,而是由这些应用程序共享同一个已载入内存的DLL。就好比一个办公室中,很少会为每一个员工配置一台饮水机的,而是在一个公共位置放上一个饮水机,所有需要喝水的职员都可以共用这台饮水机,降低了成本又节约了空间。
④共享程序资源
包括刚才提到过的通用文件对话框在内,DLL文件提供了应用程序间共享资源的可能。资源可以是程序对话框、字符串、图标,或者声音文件等。
⑤解决应用程序本地化问题
在下载了某个程序的汉化包后,打开汉化说明,经常可以看到用下载包中的DLL文件覆盖掉程序原来的DLL,汉化就完成了。这些程序都是将执行代码和应用程序界面分开编写了,所以汉化者只需简单地将其中和程序界面相关的DLL汉化并发布即可。
求知若渴:探究DLL的真相
谁知道DLL里究竟有多少函数,又有谁知道EXE调用了哪个DLL的哪些函数?其实,这个问题并不难解决。还记不记得本刊2004年第6期的《无间盗IV——盗亦有盗》中介绍的分析EXE文件的工具Dependency Walker(以下简称Depends)今天我们要用它当探险工具,把DLL真相探个通通透透。
1.看看DLL里有多少函数
第一步:下载并解压Depends,运行其中的depends.exe,然后选择菜单“File→Open”(文件→打开),在文件选择框中选中需要分析的DLL文件并打开,此处选择QQ目录下的QQZip.dll。
第二步:在程序左侧的树状栏中就列出了这个DLL使用了哪些其他DLL的功能函数(原来DLL中还可以调用其他DLL^O^),而右侧的两个分栏列表分别显示了函数输入及输出表,函数输出表即为该DLL提供给其他EXE或者DLL调用的函数的总列表。
第三步:函数输出表的Function栏中即为输出函数的名称(见图1),在QQZip.dll中共发现了2个函数:Unzip、Zip。因此可以判断该DLL在QQ程序中负责压缩和解压缩的任务。
2.审审EXE究竟用了哪个DLL
还是拿QQ来作为例子,在Depends中打开QQ.exe,这时界面左侧的树状列表中显示的就是QQ.exe调用的DLL列表(见图2),如果展开这些DLL分支,还会发现其他的DLL,这就说明QQ调用的这些DLL文件还有可能(几乎是肯定)再调用别的DLL。这就好比买了一台新的DVD机,可能其中用的机芯是SONY的,而这个机芯里的一个小电容又有可能是别的公司的,这是同样的道理。
3.用DLL看穿EXE真面目
刚才得到了QQ.exe所使用的DLL列表,其实通过这个列表,还能分析出很多别的信息。比如其中包含MFC42.dll,所以可以判断QQ.exe是采用VC(即Visual C++)编写的,而包含WSOCK32.dll则说明这个程序带有网络通讯功能(废话!QQ如果不能网络通讯还有什么用……)。以下是一个简表,大家在分析别的EXE时可以根据其所使用的DLL来对其功能进行初步判断。
DLL文件名 可以判断出的EXE信息
MFC42.dll 使用VC5.0/6.0编写。
VBRun*.dll “”代表数字版本号,使用VB3.0/4.0编写。
MSVBVM50.dll 使用VB5.0编写,在Windows 98(SE)上自带该DLL。
MSVBVM60.dll 使用VB6.0编写,在Windows Me/2000/XP等系统上自带该DLL。
ADVAPI32.dll 可能会进行注册表操作。
WSOCK32.dll 具备网络通讯功能。
WS2_32.dll 具备网络通讯功能。
WININET.dll 具备HTTP浏览、下载等功能,典型的例子是浏览器、下载工具。
WINMM.dll 具备多媒体播放能力。
DDRAW.dll 游戏、高级图像处理工具。
D3D.dll 3D游戏,或者动画处理工具。
4.DLL是个大宝库
除供应用程序调用函数的DLL外,还有另一种用来保存资源的DLL,比如QQ目录下的QQRes.dll,用Depends打开后发现没有任何输出函数,难道是一个鸡肋DLL?可是改用资源工具Resource Hacker(下载地址:http://www.mydown.com/soft/42/42058.html)打开这个DLL后,就发现原来其中保存了这么多QQ的资源,包括图标、音乐、图片、字符串、对话框……(见图3)
http://www.taodudu.cc/news/show-2869534.html
相关文章:
- 博客代码总算要结束了!
- Java利用JNA调用C#的dll
- [未来成长] 分享:《麦肯锡教我的写作武器》如何写出一篇具有逻辑表现力的文案...
- 网站木马学习2
- 开始找工作的道路!
- 系统集成十大项目管理(1)
- SQL事务的学习
- 大学生职业生涯发展与规划
- 项目管理过程-5个管理过程组、10大管理知识域以及对应输入、工具技术和输出
- 在网站的地址栏中的显示个性图标
- python爬小说一本一本爬_【学习笔记】Python爬取某一本小说
- 想要好好写论文的我
- 三大分析法——SWOT、PEST、波特五力
- Hilt的使用(动态模块)四
- val.substring is not a function
- 判断深度学习的效果好坏loss和val_loss比较
- 神经网络与深度学习---train_loss和val_loss(test_lost)分析
- val_loss先下降后上升或不下降只上升
- Error response from daemon: Get https://192.168.x.x/v2/: x509: cannot validate certificate for
- YOLOv5数据集划分脚本(train、val、test)
- intval()和int()
- 把数组对象[{key1:val1},{key2:val2}] 的key val 分割成独立的数组
- Kotlin中val和var的区别
- scala val 与var 区别
- val( )函数的用法
- val和var和Java
- python listnode.val_Python 学习 -- 数据结构与算法 (五)
- intval的绕过和chr的利用
- scala中val function
- java基本类型val_Java的基本数据类型
DLL简述,很有意思相关推荐
- Java初级面试题!!自己出几道面试题,感觉很有意思
准备面试,看资料发现一些知识点很有意思,所以自己写几个面试题,以后好坑人!! 1.构造器里可以调用构造器吗?需要注意什么? 只能调用一个构造器,而且必须处于最起始位置.除了构造器外,禁止其他方法调用中 ...
- 7个小众却很有意思的工具推荐,每一个都是大宝藏!
作为一个工具控,自己也体验了上百个软件和网站,今天给大家推荐7个小众很有意思的工具,喜欢的话记得点赞支持哦~ 1.正版中国 正版中国是一个分享正版软件限时免费信息的网站.有很多优质的正版软件会做一些限 ...
- 一个很有意思的问题: 揭示了计算机程序问题的一般处理思路
2019独角兽企业重金招聘Python工程师标准>>> 一个很有意思的问题: 揭示了计算机程序问题的一般处理思路 === 问题标题: 如何统计汉字的字数? 问题内容: 我想统计: & ...
- 不再有神的概念,将所有存在称之为文明,这很有意思
不再有神的概念,将所有存在称之为文明,这很有意思 宇宙7级文明到底有多恐怖?科学家:不再是生物,宇宙创造者 2019-04-29 23:17 未解三分钟 标签: 宇宙文明 地球 科学 以前的科学家认为 ...
- Java异常处理机制很有意思
版权声明:欢迎转载,请注明沉默王二原创. https://blog.csdn.net/qing_gee/article/details/43015379 前言:在网络上看到一篇<深入理解Java ...
- 工作214:结构 vue操作一个很有意思的报错 [Vue warn]: You may have an infinite update loop in a component
结构 vue操作一个很有意思的报错 [Vue warn]: You may have an infinite update loop in a component render function. 代 ...
- 00003-回文数的判定-leetcode-解法不唯一,1.reverse最简单,2.数学方法很有意思
回文数的判定 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/palindrome-number 著作权归领扣网络所有.商业转载请联系官方授权, ...
- python集合类型中的元素是有序的_python基础篇:很有意思的数据类型,集合(set) 常用去去重...
Python集合(set),是一个很有意思的数据结构.从形式上看,它像字典有key但没有value,它的写法是这样的s = {'a', 'b', 'c'},是不是像一个没有value的字典?另一方面, ...
- 现如今有一个很有意思的现象,不管是工厂还是经销商
现如今有一个很有意思的现象,不管是工厂还是经销商,生意不好的时候,很多人都是想着通过降价来解决问题,但结果却是没什么用. 这其实算是个坏毛病,第一次便宜的时候,也许还能够出点量.因为在我们传统的思维里 ...
- 掌握赚钱最快的方法 其实赚钱很有意思 你可以什么都不会
其实现在互联网赚钱真的很有意思 真正开始创业熬过初期你会发现赚钱很有意思 我上班的的时候,认为自己要去创业当老板要花很多钱,要融很多资金才能赚钱.当时认识了一个小伙子,也是喜欢创业,他就每天想办法从别 ...
最新文章
- R语言ggplot2可视化:使用scale_y_continous函数自定义指定Y轴的坐标范围以及对应的数值、将坐标轴的数值设置为需要的数据类型(整型、浮点型)
- 谈谈自己对java的学习看法
- 几个ARX取CAD窗口句柄的函数
- struct output SVM
- 重新理解“无容灾不上云”:应用多活将成为云原生容灾新趋势
- 最坏情况为线性时间的选择算法
- 哈工大人工智能研究院院长刘劼:AIoT 核心在“智”不在“联”,需云边端协同...
- 优酷 米兔机器人_ONEBOT积木机器人上手评测,寓教于乐的反履机甲让孩子爱不释手...
- ipad远程连接虚拟机linux,如何从ipad pro上通过SSH远程Linux
- HDU 2588 GCD 【Euler + 暴力技巧】
- 2021年中国传送控制器市场趋势报告、技术动态创新及2027年市场预测
- 再见,中关村“金三角”!
- 跟KingDZ学HTML5之八 HTML5之Web Save
- Javascript文件加载:LABjs和RequireJS
- 每天15分钟,就能轻松告别拖延症
- py使用pie绘制饼图或圆环图
- android 斜边_Android -- 一个滑动旋转的弧形菜单
- 从晶体管开始聊聊计算机为什么采用二进制
- 通往奥格瑞玛的道路(二分+迪杰斯特拉堆优化)
- 数据库访问性能优化(转)