内能又叫什么:DLL综述

来源:百度文库 编辑:偶看新闻 时间:2024/05/09 06:40:31

 

DLL综述


  DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。
  它允许程序共享执行特殊任务所必需的代码和其他资源比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序 EXE 文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的 EXE 程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。
  Windows 系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的 DLL 文件,并可对它们单独编译和测试。在运行时,只有当 EXE 程序确实要调用这些 DLL 模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了 EXE 文件的大小和对内存空间的需求,而且使这些 DLL 模块可以同时被多个应用程序使用。Windows 自己就将一些主要的系统功能以 DLL 模块的形式实现。
  一般来说,DLL 是一种磁盘文件,以.dll、.DRV、.FON、.SYS 和许多以 .EXE 为扩展名的系统文件都可以是 DLL。它由全局数据、服务函数和资源组成,在运行时被系统加载到调用进程的虚拟空间中,成为调用进程的一部分。如果与其它 DLL 之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL 模块中包含各种导出函数,用于向外界提供服务。DLL 可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式;一个 DLL 在内存中只有一个实例;DLL 实现了代码封装性;DLL 的编制与具体的编程语言及编译器无关。
  在 Win32 环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL 模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。Windows 在加载 DLL 模块时将进程函数调用与 DLL 文件的导出函数相匹配。Windows 操作系统对 DLL 的操作仅仅是把 DLL 映射到需要它的进程的虚拟地址空间里去。DLL 函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。

[编辑本段]DLL的数种调用方式

  1、静态调用方式:由编译系统完成对 DLL 的加载和应用程序结束时 DLL 卸载的编码(如还有其它程序使用该 DLL,则 Windows 对 DLL 的应用记录减1,直到所有相关程序都结束对该 DLL 的使用时才释放它,简单实用,但不够灵活,只能满足一般要求。
  隐式的调用:需要把产生动态连接库时产生的 .LIB 文件加入到应用程序的工程中,想使用 DLL 中的函数时,只须说明一下。隐式调用不需要调用 LoadLibrary() 和 FreeLibrary()。程序员在建立一个 DLL 文件时,链接程序会自动生成一个与之对应的 LIB 导入文件。该文件包含了每一个 DLL 导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB 文件作为 DLL 的替代文件被编译到应用程序项目中。
  当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与 LIB 文件中导出符号相匹配,这些符号或标识号进入到生成的 EXE 文件中。LIB 文件中也包含了对应的 DL L文件名(但不是完全的路径名),链接程序将其存储在 EXE 文件内部。
  当应用程序运行过程中需要加载 DLL 文件时,Windows 根据这些信息发现并加载 DLL,然后通过符号名或标识号实现对 DLL 函数的动态链接。所有被应用程序调用的 DLL 文件都会在应用程序 EXE 文件加载时被加载在到内存中。可执行程序链接到一个包含 DLL 输出函数信息的输入库文件(.LIB文件)。操作系统在加载使用可执行程序时加载 DLL。可执行程序直接通过函数名调用 DLL 的输出函数,调用方法和程序内部其 它的函数是一样的。
  2、动态调用方式:是由编程者用 API 函数加载和卸载 DLL 来达到调用 DLL 的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。
  显式的调用:
  是指在应用程序中用 LoadLibrary 或 MFC 提供的 AfxLoadLibrary 显式的将自己所做的动态连接库调进来,动态连接库的文件名即是上面两个函数的参数,再用 GetProcAddress() 获取想要引入的函数。自此,你就可以象使用如同本应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用 FreeLibrary 或 MFC 提供的 AfxFreeLibrary 释放动态连接库。直接调用 Win32 的 LoadLibary 函数,并指定 DLL 的路径作为参数。LoadLibary 返回 HINSTANCE 参数,应用程序在调用 GetProcAddress 函数时使用这一参数。GetProcAddress 函数将符号名或标识号转换为 DLL 内部的地址。程序员可以决定 DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个 DLL 文件。使用 DLL 的程序在使用之前必须加载(LoadLibrary)加载DLL从而得到一个DLL模块的句柄,然后调用 GetProcAddress 函数得到输出函数的指针,在退出之前必须卸载DLL(FreeLibrary)。
  正因为DLL 有占用内存小,好编辑等的特点有很多电脑病毒都是DLL格式文件。但不能单独运行。
  动态链接库通常都不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。

[编辑本段]DLL和内存管理

  在Win32中,DLL文件按照片段(sections)进行组织。每个片段有它自己的属性,如可写或是只读、可执行(代码)或者不可执行(数据)等等。
  DLL代码段通常被使用这个DLL的进程所共享;也就是说它们在物理内存中占据一个地方,并且不会出现在页面文件中。如果代码段所占据的物理内存被收回,它的内容就会被放弃,后面如果需要的话就直接从DLL文件重新加载。
  与代码段不同,DLL的数据段通常是私有的;也就是说,每个使用DLL的进程都有自己的DLL数据副本。作为选择,数据段可以设置为共享,允许通过这个共享内存区域进行进程间通信。但是,因为用户权限不能应用到这个共享DLL内存,这将产生一个安全漏洞;也就是一个进程能够破坏共享数据,这将导致其它的共享进程异常。例如,一个使用访客账号的进程将可能通过这种方式破坏其它运行在特权账号的进程。这是在DLL中避免使用共享片段的一个重要原因。
  当DLL被如UPX这样一个可执行的packer压缩时,它的所有代码段都标记为可以读写并且是非共享的。可以读写的代码段,类似于私有数据段,是每个进程私有的并且被页面文件备份。这样,压缩DLL将同时增加内存和磁盘空间消耗,所以共享DLL应当避免使用压缩DLL。
  找到DLL文件地址:C:\WINDOWS\system32\****.dll时出错(****就是你的那个找不到的文件名)
  开始--运行--msconfig--启动--找到和你说的类似的选项****--取消勾--确定,然后
  1,开始-运行-输入:regedit,然后回车
  2,选择“我的电脑”,然后点击“文件”-“导出”-随便起个名字点“保存”。这样做的目的是备份一下注册表,以免误操作后及时恢复。恢复的方法是,找到你刚才保存的文件,双击它,然后选择“允许导入”即可。
  3,选择“我的电脑”,按F3键,然后输入“****”,点击“查找下一个”,找到后一定要核对是不是****.dll文件,因为你给的文件名不全,如果确认,对该项点“右键”选“删除”。“此时可以输入****.dll进行查找,结果出来后要看后面的数值部分,不能光看文件名称,只要有****.dll在的文件不管它边上还写没写别的(如:****.dll,load),都要删除!”
  4,然后再按F3键-删除,直到提示“没有找到相应选项”为止。
  5,重新启动计算机,看看系统有没有问题。
  注,如果出现了其它严重问题,请恢复注册表。

[编辑本段]巧用DLL优化系统

  逼迫DLL文件交出内存资源
  不少应用程序在启动时需要调用某些DLL文件,这些DLL文件往往会占用一定的内存资源,但遗憾的是当应用程序被使用完毕退出系统后,那些曾经被调用的DLL文件并不会随程序关闭而自动交出它们所占用的内存资源,这样就容易造成内存资源的浪费,并且随着运行的应用程序越多,系统内存资源就被消耗得越多,最终会影响系统的整体运行效率。那有没有办法逼迫那些已经过时的DLL文件,交出它们所占有的内存资源,从而保证系统内存空间始终处于“干净”状态呢?答案是肯定的,我们可以按照如下步骤来逼迫DLL文件交出内存资源:
  依次单击“开始”/“运行”命令,在弹出的系统运行对话框中,输入字符串命令“regedit”,单击“确定”按钮后,打开系统的注册表编辑界面;
  在注册表编辑界面中,找到其中的注册表分支HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Explorer在对应“Explorer”子键的右侧窗口区域中,检查一下是否有“AlwaysUnloadDLL”字符串键值的身影,如果没有的话,那可以用鼠标右键单击右侧窗口区域中的空白位置,并从弹出的快捷菜单中依次执行“新建”、“字符串值”命令,然后将新创建好的字符串值名称设置为“AlwaysUnloadDLL”,再用鼠标双击“AlwaysUnloadDLL”键值,在其后界面的“数值数据”文本框中直接输入数字“1”,并单击“确定”按钮,最后刷新一下系统注册表,这样就能逼迫那些过时的DLL文件交出曾经占有的系统内存资源了。
  逼迫DLL文件交出空间资源
  在频繁地安装与卸载应用程序之后,系统中的有些DLL文件就会变成无用的垃圾文件,不过这些垃圾文件仍然会占用系统的硬盘空间资源,时间一长越来越多的垃圾DLL文件就会消耗越来越多的硬盘空间资源。为此,我们可以通过下面的操作步骤,来将无用的垃圾DLL文件删除掉:
  依次单击“开始”/“运行”命令,在弹出的系统运行对话框中,输入字符串命令“regedit”,单击“确定”按钮后,打开系统的注册表编辑界面;
  用鼠标逐一展开其中的注册表分支HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/SharedDlls在对应“SharedDlls”子键的右侧窗口区域中,我们就能看到当前系统的所有DLL调用情况,要是对应某个DLL文件的数据显示为“0”的话,那就说明没有应用程序使用该DLL文件,那么该DLL文件就是无用垃圾文件,将这些无用的DLL文件名称逐一记录下来;
  接下来返回到Windows系统桌面,并依次单击“开始”/“搜索”/“文件或文件夹”命令,然后在弹出的系统搜索文件对话框中,输入前面记录下来的无用DLL文件,再单击“搜索”按钮找到无用DLL文件所在的具体位置,之后将这些找到的DLL文件临时转移到其他位置,并让系统再运行一些日子,看看系统是否能够正常运行,要是系统仍然可以正常运行的话,那我们就能把那些无用的DLL文件真的从硬盘中删除掉了,这样就能有效地节省硬盘空间资源了。
  借用DLL文件解决系统运行错误
  由于许多应用程序的DLL文件都是共用的,一旦对某个应用程序执行了卸载操作之后,共用的那个DLL文件也有可能被随之卸载,这么一来其他应用程序运行时由于找不到共用DLL文件而出现运行错误。当不幸遇到这样的故障现象时,我们不妨通过对DLL文件的注册与卸载,来快速有效地解决各种常见的系统故障。

[编辑本段]WINXP/WIN2000通过修改DLL提升安全和性能

  系统的组策略和注册表中,我们可以修改一些键值来优化我们的系统,并加强操作系统的安全性。可是,对于限制下载、禁止删除文件等功能,我们无法通过上述的操作来完成,这只有通过修改系统DLL文件来实现。目前,我们通过修改系统的DLL文件,可以实现禁止删除文件、禁止IE下载、禁止IE另存为、禁止文件打开方式等功能。
  系统中部分DLL文件的功能
  1、Browselc.dll IE所需要调用的库文件DLL结构雏形就是它了
  2、Shdoclc.dll 系统窗口及设置等,如删除文件、重命名
  3、Shell32.dll 系统窗口及设置等,如删除文件、重命名
  4、Cryptui.dll IE控件下载及提示对话框程序
  修改DLL文件的方法
  1、下载DLL文件修改工具EXESCOPE6.0-6.3或6.4工具
  2、获取Browselc.dll、Shdoclc.dll、Shell32.dll和Cryptui.dll这几个链接文件。在找这几个文件时,最好将其他机器的硬盘,挂接在本机中,然后用本机的操作系统启动并复制这几个文件。
  3、在修改DLL文件的时候,打开该键值,在右面的对话框中将所要修改的键值禁用即可,不要删除,以备日后恢复
  DLL文件修改秘籍
  1、禁止下载的修改方法:打开Shdoclc.dll修改资源--对话框---4416,将4416键值禁用即可。
  2、禁止网页添加到收藏夹,打开Shdoclc.dll修改资源--对话框---21400,将该键值禁用即可。
  3、禁止恶意网页加载控件,修改Cryptui.dll文件,要同时修改5个地方才能完全禁止 资源--对话框---130 资源--对话框---230 资源--对话框---4101 资源--对话框---4104 资源--对话框---4107 将以各对话框中的相应键值,修改成为禁用就可以了。
  4、禁止系统删除文件修改Shell32.dll,这个文件需要修改5个地方才可以禁止系统删除文件。资源--对话框---1011 资源--对话框---1012 资源--对话框---1013 资源--对话框---1021 资源--对话框---1022 将以上五个地址的键值禁用就可以了!
  5、禁止文件被改名,修改shell32.dll,有2个地方需要修改资源--对话框---1018 资源--对话框---1019 将以上两处的相应键值,修改为禁用就可以了!
  6、禁止运行菜单,修改shell32.dll,将资源--对话框---1018键值设置为禁用。
  7、禁止系统文件被挪动修改shell32.dll,需要修改4个地方 资源--对话框---1014 资源--对话框---1015 资源--对话框---1016 资源--对话框---1017
  8、禁止目标另存为,修改Shdoclc.dll文件,需要修改3个地方 资源--菜单--258---257 资源--菜单--258---252 资源--菜单--24641--2268 在这个修改中,我们要把各对应的键值删除。打开该键值后,右键菜单中有删除。在资源--菜单--24641—2268中,有多项该键值,请逐一删除。
  9、禁止自定义文件夹选项修改Shell32.dll文件,需要修改以下4个地方 资源--菜单--215---28719 资源--菜单--216---28719 资源--菜单--217---28719 资源--菜单--216---28719 找到以上四处键值,直接需要删除后即可,而不是禁用。
  10、禁止IE文件夹选项,修改Browselc.dll文件,需要修改3个键值 资源--菜单--263 (这里有多个请删除)---41251(删除) 资源--菜单--266(也有多个请删除)---41329 (删除) 资源--菜单--268---41251 (删除) 在上面的3个键值中,个别键值有多处,请逐一删除。
  11、禁止98文件共享控件,修改Msshrui.dll,需要修改2个地方 资源---对话框---- 1 --- AutoRadioButton 资源---对话框---- 30 --- AutoRadioButton 将以上两处的键值禁用即可。其他的选项,可以根据自己的需要进行修改。找到相应的功能键值,将不需要的功能,禁用就可以了。
  12、禁止文件的打开方式,修改Url.dll,需要修改2个地方 资源---对话框--- 7000 资源---对话框--- 7005 将以上两处的键值禁用即可。
  13、禁止更改系统桌面,修改Shdoc401.dll,有2处地方需要修改 资源---对话框--- 29952--- PushButton:浏览资源---对话框--- 29952--- PushButton:图案 将以上两处的键值禁用即可。
  14、禁止系统文件夹自定义,修改Shd401lc.dll,有2处地方需要修改 资源---对话框--- 29957 资源---对话框--- 29958 将以上两处的键值禁用即可。
  15、禁止文件保存路径及打开,修改Comdlg32.dll,有2处地方需要修改 资源---对话框--- 1547 资源---对话框--- 1548 将以上两处的键值禁用即可。