«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
 

上善若水 厚德载物


我的分类(专题)

首页(2340)
幽你一默(198)
美食与健康(55)
English(832)
文学欣赏(76)
计算机应用(694)
音乐(120)
小知识(235)
修身养性(289)
相关下载(10)


最新日志
七天养成一个好习惯,52个星期后你就会脱
TOP TEN RULES TO BAG
到了才知道~
给更重要的事留出更多时间
那些最熟悉的“陌生”词
一个好男人一生中要处理好七件事:
Heart to Heart
10招教你应对粗鲁的人
10个小细节 平凡的我们也能改变世界
毕业生为何都要穿学位服
六字英文微小说:言有尽意无穷
Education
用26个英文字母概括80后的生存原则
2014年巴西世界杯主题曲《We Are
年轻的求职者都会犯的10个错
屁话自有屁用
15大信号 在我们身边的都是好朋友
人生是一场相逢,又是一场遗忘
各国简介中英互译
7 cardinal rules in

最新回复
回复:TOP TEN RULES TO 
回复:“我挺你”的10种英文表达
回复:啥样的身体才叫健康
回复:啥样的身体才叫健康
回复:sorry不是随便就能说的
回复:【蜗牛机型专用】风林火山 GHOS
回复:有些人
回复:和英国人交流要小心
回复:野火烧不尽 春风吹又生——解读白居
回复:英语最常用5000单词【英英注释】
回复:[收藏]色拉英语乐园教材[下载]
回复:英语最常用5000单词【英英注释】
回复:英语最常用5000单词【英英注释】
回复:英语最常用5000单词【英英注释】
回复:古人咏叹中秋的经典诗句
回复:[收藏]原子分析英语词根 2006
回复:[收藏]色拉英语乐园教材[下载]
回复:美国独立日
回复:嘴边最COOL的英语
回复:中国古代四大才女

留言板
签写新留言

牛年牛一把
牛年快乐
hello
分享
感谢
因为距离所以美丽
您的子域名已开通。

统计
blog名称:宁静致远
日志总数:2340
评论数量:2658
留言数量:88
访问次数:17513208
建立时间:2004年11月1日

链接




本站首页    管理页面    写新日志    退出

[计算机应用][收藏]动态链接库---Windows系统的活动大陆
hjx_221 发表于 2006/8/6 23:04:25

本文转载自W3CHINA.ORG讨论区(BBS.W3CHINA.ORG)   原文链接以下为原文:动态链接库---Windows系统的活动大陆  在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字--动态链接库。现在就让我们走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧!    初窥门径:Windows的基石    随便打开一个系统目录,一眼望去就能看到很多扩展名DLL的文件,这些就是经常说的&amp;quot;动态链接库&amp;quot;,DLL是Dynamic Link Library(即&amp;quot;动态链接库&amp;quot;)的缩写。从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真相探个通通透透。   第一步:下载并解压Depends,运行其中的depends.exe,然后选择菜单:File→Open&amp;quot;(文件→打开),在文件选择框中选中需要分析的DLL文件并打开,此处选择QQ目录下的QQZip.dll。   第二步:在程序左侧的树状栏中就列出了这个DLL使用了哪些其他DLL的功能函数(原来DLL中还可以调用其他DLL&amp;quot;O&amp;quot;),而右侧的两个分栏列表分别显示了函数输入及输出表,函数输出表即为该DLL提供给其他EXE或者DLL调用的函数的总列表。   第三步:函数输出表的Function栏中即为输出函数的名称(见图1),在QQZip.dll中共发现了2个函数:Unzip、Zip。因此可以判断该DLL在QQ程序中负责压缩和解压缩的任务。 500)this.width=500'>screen.width-333)this.width=screen.width-333" border=0>        2.审审EXE究竟用了哪个DLL   还是拿QQ来作为例子,在Depends中打开QQ.exe,这时界面左侧的树状列表中显示的就是QQ.exe调用的DLL列表(见图2),如果展开这些DLL分支,还会发现其他的DLL,这就说明QQ调用的这些DLL文件还有可能(几乎是肯定)再调用别的DLL。这就好比买了一台新的DVD机,可能其中用的机芯是SONY的,而这个机芯里的一个小电容又有可能是别的公司的,这是同样的道理。 500)this.width=500'>screen.width-333)this.width=screen.width-333" border=0>        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游戏,或者动画处理工具。   除供应用程序调用函数的DLL外,还有另一种用来保存资源的DLL,比如QQ目录下的QQRes.dll,用Depends打开后发现没有任何输出函数,难道是一个鸡肋DLL?可是改用资源工具Resource Hacker(下载地址:http://www.onlinedown.net/soft/12420.htm) 打开这个DLL后,就发现原来其中保存了这么多QQ的资源,包括图标、音乐、图片、字符串、对话框……(见图3)           刨根问底:DLL的寓言    DLL引起的故障是很常见的,为什么会引起故障?遇到故障怎么解决?嘘~偷听一下DLL的对话,你就会明白了。   1.从搬运工谈接口兼容性   在Windows工地上,有一个名叫EXE的包工头,他手下有很多称为DLL的建筑工人。其中有一个专门负责搬运的DLL(暂且称为&amp;quot;搬运工A&amp;quot;),每次需要搬运水泥时,包工头EXE都只要对他喊一声:&amp;quot;来!搬。&amp;quot;   过了一段时间,搬运工A觉得自己的效率太低,于是从原来的每次搬1袋水泥改成了每次搬3袋水泥。改进了搬运方法后,EXE包工头仍然每次只是喊一声:&amp;quot;来!搬。&amp;quot;却不知搬运工A已经改变了搬运的方法。   但又过了一段时间,包工头EXE把搬运工A给辞退了,从别的工地上找来了另一个DLL(暂且称为&amp;quot;搬运工B&amp;quot;)。这个搬运工在别的工地的时候,搬运东西特别快,所以包工头EXE决定把搬运工作给&amp;quot;升级&amp;quot;一下。但真正开始工作时,包工头才发现出了问题……现在不管叫几遍来搬。这个新来的搬运工B都不知道究竟应该搬什么。   上面的例子中,搬运工A改进搬运方法,但EXE调用它的方法仍不变,这就是DLL升级的原理,改进了内部的实现方法,但调用接口不变,这样EXE文件不用跟着升级,就能调用新版本的DLL了。而搬运工B的故事告诉我们,不管新版本的DLL效率多高,如果接口(可以理解为DLL中输出的函数名)与原来的不一致,那么EXE就不知道也无法调用它了。   2.登记身份证的DLL   在系统故障中,有很多都是由于DLL文件没有注册造成的,比如Windows XP的压缩文件夹功能出现故障就很有可能是系统目录中的zipfldr.dll没有注册造成的,这类故障的解决方法也大多是运行如下命令:   1.Windows 2000/XP:用记事本打开C盘的Boot.ini文件,在带有/fastdetect的语句后面空一格,添加/noguiboot参数即可。    小提示:如果在C盘找不到Boot.ini文件,请在资源管理器中点击菜单;工具→文件夹选项,在弹出的对话框中选择查看;选项卡,选中显示所有的文件和文件夹,并将隐藏受保护的操作系统文件;前面的复选框清空,单击确定按钮退出,此时你就会发现C盘中Boot.ini文件现身了。    2.Foxmail、金山词霸:在其快捷方式图标上点击右键并选择属性,在弹出的属性窗口的目标文本框的命令最后空一格,添加nosplash参数即可。   3.瑞星计算机监控:在瑞星的安装目录 sing av下找到RavMon.bmp,将该图片删除或移出该目录即可。   4.MS-Office Word:创建一个Word程序的快捷方式,在它的快捷方式图标上点击右键并选择属性,在弹出的属性窗口的;目标文本框的命令最后空一格,添加-q 参数即可。    Excel:创建一个Excel程序的快捷方式,在它的快捷方式图标上点击右键并选择属性。在弹出的属性窗口的目标文本框的命令最后空一格,添加-e参数即可。     PowerPoint:创建一个PowerPoint程序的快捷方式,在它的快捷方式图标上点击右键并选择属性,在弹出的属性窗口的目标文本框的命令最后空一格,添加-splash参数即可。   5.Outlook Express:运行regedit命令,打开注册表编辑器。在注册表编辑器左侧的树状目录中依次打HKEY_CURRENT_USERIdentities{85C55925-BF44-47A8-8212-51632070BA57SoftwareMicrosoftOutlook Express5.0主键(注意:在你的注册表中,你看到的那个里面的内容可能不是85C55925-BF44-47A8-8212-51632070BA57,这是正常的)。在注册表编辑器右侧窗口中找到名为Nosplash的DWORD值,并将其键值改为1 即可(如果没有该键值,可以自己新建一个)。   6.ACDSee: 到现在还习惯使用ACDSee 4.0的朋友,如果觉得它的启动界面很烦人,可以点击菜单Tools→Options,在弹出的Options对话框中选择Interface选项卡,将Show splash screen on startup前面的复选框清空,单击确定按钮即可。<完>参与讨论本主题

阅读全文(3060) | 回复(0) | 编辑 | 精华

回复:[收藏]动态链接库---Windows系统的活动大陆
某日清晨(游客)发表评论于2006/8/7 8:37:36

高手!

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)
站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.094 second(s), page refreshed 144758385 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号