您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > windows

Windows DLL基本原理及为何需要注册

时间:2019-05-13 10:24:20  来源:  作者:

1 程序的模块化

如果你是一个程序员就会知道,编程都是需要使用函数库(library)或类库的,也就是说,通常库是程序的有机部分,可以静态链接(.lib,在使用.lib之前,要在程序源代码中引用lib对应的头文件.h并在编译时直接加到源文件中)或动态链接(DLL,Dynamic Linked Library,程序运行时加载)成为程序的一部分。

windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。如在 Windows操作系统中,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。

通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。

MS把所有的API函数是放在几个大的*.LIB中,另外还提供一对应的几个*.inc,实际上它如同*.h头文件,起到声明API函数的目的。

DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。DLL文件一般被存放在C:WindowsSystem目录下。

DLL文件中存放的是各类程序的函数(子过程)实现过程,当程序需要调用函数时需要先载入DLL,然后取得函数的地址,最后进行调用。使用DLL文件的好处是程序不需要在运行之初加载所有代码,只有在程序需要某个函数的时候才从DLL中取出。另外,使用DLL文件还可以减小程序的体积。

Windows系统平台上,你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。Microsoft Windows自己就将一些主要的系统功能以DLL模块的形式实现。例如IE中的一些基本功能就是由DLL文件实现的,它可以被其它应用程序调用和集成。一般来说,DLL是一种磁盘文件(通常带有DLL扩展名,是标准win32可执行文件-“PE”格式),它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分,进程中所有线程都可以调用其中的函数。如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL模块中包含各种导出函数,用于向外界提供服务。Windows在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。

系统的组策略和注册表中,我们可以修改一些键值来优化我们的系统,并加强操作系统的安全性。可是,对于限制下载、禁止删除文件等功能,我们无法通过上述的操作来完成,这只有通过修改系统DLL文件来实现。目前,我们通过修改系统的DLL文件,可以实现禁止删除文件、禁止IE下载、禁止IE另存为、禁止文件打开方式等功能。

2 为什么要用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汉化并发布即可。

3 隐式链接和显式链接

应用程序导入函数与DLL文件中的导出函数进行链接有两种方式:隐式链接和显式链接。

隐式链接(load-time dynamic linking)是指在应用程序中不需指明DLL文件的实际存储路径,程序员不需关心DLL文件的实际装载(由编译器自动完成地址分配)。采用隐式链接方式,程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL函数的动态链接。我们使用的大部分系统Dll就是通过这样的方式链接的。若找不到需要的Dll则会给出一个Dll缺少的错误消息。

显式链接(run-time dynamic linking)与此相反。用户程序在编译的时候并没有指明需要哪些Dll,而是在运行起来之后调用Win32 的LoadLibary()函数,去装载Dll。若没有找到Dll则这个函数就会返回一个错误。在用LoadLibary()函数装载Dll之后,应用程序还需要用GetProcAdress()函数去获得Dll输出函数的地址。显式链接方式对于集成化的开发语言比较适合。有了显式链接,程序员就不必再使用导入文件,而是直接调用Win32 的LoadLibary()函数,并指定DLL的路径作为参数。还要说明一点的就是Known Dlls就是保证在通过LoadLibary()去装载系统Dll的时候,只从特定的系统目录去装载,防止装载错。装载的时候会去看注册表下是否有一样的注册表键名。

应用程序怎样找到DLL文件

如果应用程序使用LoadLibrary显式链接,那么在这个函数的参数中可以指定DLL文件的完整路径。如果不指定路径,或是进行隐式链接,Windows将遵循下面的搜索顺序来定位DLL:

I 包含EXE文件的目录,

II 进程的当前工作目录,

III Windows系统目录,

IV Windows目录,

V 列在Path环境变量中的一系列目录。

在Windows上有个注册表键值决定了Dll的搜索顺序:HKLMSystemCurrentControlSetSessionManagerSafeDllSearchMode。在windows 7,server2003,xp sp2中这个值为1,在xp,2000 sp4中为0。

1值时的搜素顺序为:1.可执行文件所在目录,2.系统目录windowssystem32,3. 16位系统目录,4.windows目录,5.当前进程目录。6.环境变量PATH中的目录。

0值时的搜素顺序为:1.可执行文件所在目录,2. 当前进程目录。3.系统目录windowssystem32,4. 16位系统目录,5.windows目录,6.环境变量PATH中的目录。

4 DLL的加载与连接

Windows DLL装入(除ntdll.dll外)和连接是通过ntdll.dll中一个函数LdrInitializeThunk实现的。先对LdrInitializeThunk()这个函数名作些解释“Ldr显然是“Loader”的缩写。而“Thunk”意为“翻译”、“转换”、或者某种起着“桥梁”作用的东西。这个词在一般的字典中是查不到的,但却是个常见于微软的资料、文档中术语。这个术语起源于编译技术,表示一小片旨在获取某个地址的代码,最初用于函数调用时“形参”和“实参”结合。后来这个术语有了不少新的特殊含义和使用,但是DLL的动态连接与函数调用时“形实结合”确实有着本质的相似。

DLL文件中包含一个导出函数表。这些导出函数由它们的符号名和称为标识号的整数与外界联系起来。函数表中还包含了DLL中函数的地址。当应用程序加载DLL模块时时,它并不知道调用函数的实际地址,但它知道函数的符号名和标识号。动态链接过程在加载的DLL模块时动态建立一个函数调用与函数地址的对应表。如果重新编译和重建DLL文件,并不需要修改应用程序,除非你改变了导出函数的符号名和参数序列。

DLL注册及为什么需要注册?

在系统故障中,有很多都是由于DLL文件丢失、损坏或没有注册造成的,比如Windows XP的压缩文件夹功能出现故障就很有可能是系统目录中的zipfldr.dll没有注册造成的,这类故障的解决方法也大多是下载一个对应的DLL并运行如下命令:

for%1 in (%windir%system32*.dll)do regsvr32.exe /s %1

很多人不理解为什么要这么做,是不是所有的DLL都能这样做呢?

其实系统中有两种DLL,一种是不需注册即可使用的,另一种则是必须经过注册才能使用的。就好像一个临时工,和一个记录在员工名单上的长期合同工的区别一样。如何才能区分这两种DLL呢?方法很简单,可以用一个工具(如Dependency Walker)打开这个DLL,看函数输出表,如果其中包含以下两个函数(前者是注册DLL,后者是反注册DLL),那么就一定是需要注册才能使用的DLL了。

DllRegisterServer

DllUnregisterServer

而regsvr32这个命令,实际上就是调用DLL中的这两个函数(“regsvr32 /u DLL文件名”调用的即为DllUnregisterServer反注册函数)。

注册与不注册,.dll文件都在system32下面。不同的是,注册了会在注册表中有相应信息,同时载入到了dll缓存,没有注册信息和进缓存就不能使用(开机时操作系统的一些核心功能再加载到了内存,并开始在后台运行,程序、数据、模块都需要进入内存才能被访问。)。

文件注册前和注册后都没有变化,只是通过命令把相应的信息添加到了注册表中。

注册文件的命令行是 regsrv32

regsrv32 xxx.dll
regsrv32 xxx.dll /u
regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname
参数说明:
/u - 解除服务器注册
/s - 无声;不显示消息框
/i - 调用 DllInstall,给其传递一个可选 [cmdline];跟 /u 一起使用时,卸载 dll
/n - 不要调用 DllRegisterServer;这个选项必须跟 /i 一起使用

-End-
 



Tags:   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Create 2024百度AI开发者大会:李彦宏带来三大AI开发工具,让人人都是开发者
“未来,自然语言将成为新的通用编程语言,你只要会说话,就可以成为一名开发者,用自己的创造力改变世界。”4月16日,Create 2024百度AI开发者大会在深圳举办。百度创始人、董事长兼...【详细内容】
2024-04-17  Search: Windows  点击:(2)  评论:(0)  加入收藏
“刘强东”当主播,扶得起京东直播吗?
定焦(dingjiaoone)原创作者 | 苏琦编辑 | 金玙璠“东哥呢,在哪里?”4月16日下午6点18分,刘强东的数字人形象“采销东哥”开启“直播首秀”,同时亮相京东家电家居、京东超市采销直...【详细内容】
2024-04-17  Search: Windows  点击:(2)  评论:(0)  加入收藏
AI圈公开的秘密:天下模型一大抄
抄袭已经成为AI世界公开的秘密。据The Information周一的文章,许多初创公司的AI聊天机器人很可能是采用了OpenAI和其他公司的数据开发的。这些机器人在某些任务上可以媲美GPT...【详细内容】
2024-04-17  Search: Windows  点击:(4)  评论:(0)  加入收藏
聚焦“一房二卖”等问题 最高检发布典型案例
记者4月16日从最高人民检察院获悉,最高检近日印发了6件涉房地产纠纷民事检察监督典型案例,聚焦“一房二卖”、逾期办理产权证、违约金调整等高发监督事项。“一房二卖”等违法...【详细内容】
2024-04-17  Search: Windows  点击:(2)  评论:(0)  加入收藏
今年买二手房最划算?70城二手房价格全都降了!
国家统计局4月16日公布的数据显示,2024年一季度,全国房地产开发投资同比下降9.5%。从销售来看,一季度,销售面积同比下降19.4%;新建商品房销售额下降27.6%。国家统计局城市司首席...【详细内容】
2024-04-17  Search: Windows  点击:(1)  评论:(0)  加入收藏
周鸿祎力挺手机支架 喊话余承东:手机在老婆手里 你能专心开车吗
快科技4月17日消息,360周鸿祎近日再次提及了雷军和余承东引发的关于手机支架的讨论,强调了手机支架与驾驶安全之间的关联。周鸿祎认为,余承东在智界S7发布会上对手机支架的讽刺...【详细内容】
2024-04-17  Search: Windows  点击:(1)  评论:(0)  加入收藏
Android 15 有望引入应用隔离功能,进一步提升系统安全性
IT之家 4 月 17 日消息,即将推出的 Android 15 系统可能引入一项全新功能:应用隔离。这一功能将更好地保护用户免受行为异常应用的侵害。Android 系统一直拥有强大的安全防护...【详细内容】
2024-04-17  Search: Windows  点击:(4)  评论:(0)  加入收藏
全球首个AI程序员Devin造假?业内人士:质疑有理,但程序员已离不开AI
·号称全球首个AI人工智能软件师Devin日前被网络博主质疑造假、炒作。业内人士分析认为,该位博主质疑有理有据,Devin的“惊人效果”确实存在一些商业炒作的嫌疑。号称“...【详细内容】
2024-04-17  Search: Windows  点击:(2)  评论:(0)  加入收藏
“刘强东”直播首秀,释放了什么信号?
文|新浪科技 原祎鸣“3!2!1!上链接!”昨晚,刘强东AI数字人(以下简称“刘强东”)完成了首秀。虽然此前已有不少明星、头部主播的“分身”活跃在直播间中,技术制造的“替代者”已不算...【详细内容】
2024-04-17  Search: Windows  点击:(2)  评论:(0)  加入收藏
A股突发!美联储传来大消息
全球市场动荡的根源其实还在于美元!最近,全球股债基本处于双杀状态,昨天A股亦是惨烈。在这种市场情绪背后,有人错误将之归咎于资本市场新规,其实根源在于美元,因为全球主要资产几...【详细内容】
2024-04-17  Search: Windows  点击:(2)  评论:(0)  加入收藏
▌简易百科推荐
Win10控制面板,这些必备知识请收好!
Win10控制面板是Windows 10操作系统中的一个重要组件,它为用户提供了一个集中管理和配置系统设置的平台。通过控制面板,用户可以轻松调整计算机的各种设置,从而优化系统性能,提...【详细内容】
2024-04-10  数据蛙恢复专家    Tags:Win10   点击:(6)  评论:(0)  加入收藏
桌面图标不见了怎么恢复?3个轻松恢复方法请记好!
在日常使用电脑的过程中,有时我们会突然发现桌面上的图标不见了,这往往会让人感到困惑和不知所措。不过,别担心,这通常只是一个小问题,有很多方法可以帮助你快速恢复桌面图标。桌...【详细内容】
2024-04-09  数据蛙恢复专家    Tags:桌面图标   点击:(9)  评论:(0)  加入收藏
Win11 24H2狠心封杀!第三方UI修改软件不能用了
快科技4月8日消息,如果你正在用一些可以修改系统UI界面、功能的第三方软件,一定不要升级Windows 11 24H2 RTM正式版,因为它们都被悄无声息地封杀了。据多位网友反馈,Windows 11...【详细内容】
2024-04-08    驱动之家  Tags:Win11   点击:(11)  评论:(0)  加入收藏
Windows 10明年结束免费支持 操作系统付费更新来了
微软宣布,Windows 10操作系统将于明年10月14日正式结束免费的技术支持。自此之后,用户想要获得更新补丁,就需要支付费用。具体而言,企业用户和个人用户将面临不同的收费标准。对...【详细内容】
2024-04-08    中关村在线  Tags:Windows   点击:(13)  评论:(0)  加入收藏
微软已修复 Win10 中 sysprep.exe 系统准备工具无法使用问题
IT之家 4 月 6 日消息,上个月,微软为 Win10 发布了最新的 KB5035941 更新,引入了新的锁屏小部件、用于桌面背景的 Windows 聚焦以及许多其他功能改进。除此之外,此次更新还解决...【详细内容】
2024-04-07    IT之家  Tags:Win10   点击:(12)  评论:(0)  加入收藏
微软 Win11 24H2 设置应用前瞻:加速去控制面板、支持sudo命令等
IT之家 4 月 5 日消息,微软正加速推进 Windows 11 24H2 更新,日前发布了 RTM 候选预览版 Build 26100 更新,而且 Windows 11 LTSC 镜像近日也偷跑现身。Windows Latest 近日发...【详细内容】
2024-04-05    IT之家  Tags:Win11   点击:(14)  评论:(0)  加入收藏
微软 Win11 新增两种键盘快捷方式,方便调整文件资源管理器列宽
IT之家 3 月 24 日消息,虽然 Windows 已经是一个非常成熟的操作系统,但微软仍会不时添加一些新的快捷键。对于用户来说,如果能更多地去了解一些常用键盘快捷键,可能对于提高办公...【详细内容】
2024-03-24    IT之家  Tags:Win11   点击:(20)  评论:(0)  加入收藏
Win11 学院:如何在 Windows 11 Build 226x1.3371 预览版锁屏中扩充财经等内容
3 月 22 日消息,微软今天发布了 Windows 11 226x1.3371 预览版更新,并邀请部分 Release Preview 频道 Windows Insider 用户,测试锁屏扩充功能。微软目前仅邀请部分用户测试,如...【详细内容】
2024-03-22    IT之家  Tags:Win11   点击:(29)  评论:(0)  加入收藏
Win10关闭自带杀毒软件教程,两招彻底把Windows Defender关闭
很多玩辅助的小伙伴电脑一般都会安装第三方杀毒软件,如360、火绒,管家等,但是Win10系统的话还自带了Windows Defender得杀毒软件,在打开一些包含EXE程序的时候,Windows Defender...【详细内容】
2024-02-26  荒野大镖客    Tags:Win10   点击:(5)  评论:(0)  加入收藏
微软 Win11 画图 Canary / Dev 更新,更接近 Photoshop 使用体验
IT之家 2 月 22 日消息,微软画图去年年底为“画图”引入了大量新功能,例如图层、深色模式,以及 DALL-E 3 集成的 AI 生图功能。@PhantomOfEarth 发现,微软最近更新了 Canary / D...【详细内容】
2024-02-23    IT之家  Tags:画图   点击:(62)  评论:(0)  加入收藏
站内最新
站内热门
站内头条