DLL文件究竟是什么,它们是如何工作的?

DLL文件究竟是如何工作的?它们似乎有很多,但我不知道它们是什么,也不知道它们是如何工作的。

那么,他们是怎么回事?

351355 次浏览

什么是DLL?

动态链接库(DLL)类似于exe,但它们不能直接执行。它们类似于Linux/Unix中的.so文件。也就是说,dll是MS对共享库的实现。

dll非常像EXE,文件格式本身是相同的。EXE和dll都基于可移植可执行文件(PE)格式。dll还可以包含COM组件和. net库。

DLL包含什么?

DLL包含EXE或其他DLL使用的函数、类、变量、ui和资源(如图标、图像、文件等)。

库的类型:

在几乎所有的操作系统上,都有两种类型的库。静态库和动态库。在windows下,文件扩展名如下:静态库(.lib)和动态库(.dll)。主要的区别是静态库在编译时链接到可执行文件;而动态链接库直到运行时才被链接。

关于静态库和动态库的更多信息:

你通常不会在你的电脑上看到静态库,因为静态库直接嵌入在模块(EXE或DLL)中。动态库是一个独立的文件。

DLL可以在任何时候被更改,并且只有在运行时EXE显式加载DLL时才会被加载。静态库一旦在EXE中编译后就不能更改。 DLL可以单独更新,而不需要更新EXE本身

加载DLL:

程序在启动时加载一个DLL,通过Win32 API LoadLibrary,或者当它是另一个DLL的依赖项时。程序使用GetProcAddress加载函数或使用LoadResource加载资源。

进一步阅读:

请检查MSDN维基百科进一步阅读。这也是答案的来源。

dll(动态链接库)包含一个或多个应用程序或服务使用的资源。它们可以包含类、图标、字符串、对象、接口以及开发人员需要存储的除UI之外的几乎任何东西。

http://support.microsoft.com/kb/815065

DLL是一个包含代码的库 而数据可以被更多的人使用 同时一个程序。为 例如,在Windows操作系统中, Comdlg32 DLL执行通用 对话框相关功能。 因此,每个程序都可以使用 中包含的功能 这个DLL来实现一个打开对话框 盒子。这有助于促进代码重用和 有效的内存使用

通过使用DLL,程序可以 模块化成独立的组件。 例如,会计程序可能 按模块出售。每个模块可以是 在运行时装入主程序 时间,如果该模块已安装。 因为模块是分开的,所以 程序加载时间更快, 一个模块只有在这种情况下才会被加载

此外,更新更容易 适用于每个模块而不影响 项目的其他部分。为 例如,你可能有一份工资单 计划,税率各不相同 的一年。当这些变化是孤立的 到DLL,则可以应用更新 无需构建或安装 再看一遍整个程序

http://en.wikipedia.org/wiki/Dynamic-link_library

DLL文件包含导出表,它是一个可以由调用程序查找的符号列表。这些符号通常是带有C呼叫约定 (__stcall)的函数。导出表还包含函数的地址。

有了这些信息,调用程序就可以调用DLL中的函数,即使它在编译时没有访问DLL的权限。

介绍动态链接库有更多的信息。

dll(动态链接库)和SLs(共享库,在UNIX下是等价的)只是可执行代码的库,可以在加载时动态链接到可执行文件。

静态库在编译时插入到可执行文件中,并从那时开始固定。它们增加了可执行文件的大小,并且不能共享。

动态库有以下优点:

1/它们是在运行时而不是编译时加载的,所以它们可以独立于可执行文件进行更新(你在windows中看到的所有漂亮的窗口和对话框都来自dll,所以你的应用程序的外观可以改变,而不必重写它)。

2/因为它们是独立的,所以代码可以在多个可执行文件之间共享——这可以节省内存,因为如果你运行100个应用程序,使用一个DLL,那么内存中可能只有一个DLL副本。

它们的主要缺点是优点#1 -让dll独立于应用程序更改可能会导致应用程序停止工作或开始以一种奇怪的方式运行。在Windows下,DLL版本控制往往不能很好地管理,这就导致了一个古怪的名字“DLL地狱”。

假设您正在制作一个可执行文件,该文件使用了库中的一些函数。

如果你使用的库是静态,链接器将直接从库中复制这些函数的目标代码,并将它们插入到可执行文件中。

现在,如果这个可执行文件正在运行,它拥有它需要的所有东西,所以可执行文件加载器只是将它加载到内存中并运行它。

如果库是动态,链接器将不会插入目标代码,而是插入一个存根,基本上说这个函数位于这个DLL中的这个位置。

现在如果这个可执行文件运行,可执行文件的位缺失(即存根),所以加载器通过可执行文件修复缺失的存根。只有在所有存根都被解析之后,才允许可执行文件运行。

要查看此操作,请删除或重命名DLL,并观察当您尝试运行可执行文件时,加载器将如何报告丢失DLL错误。

因此命名为动态链接库,部分链接过程是由可执行加载程序在运行时动态完成的。

最后提醒一下,如果你不链接到DLL,那么链接器就不会插入存根,但是Windows仍然提供了GetProcAddress API,允许你在可执行文件启动很久之后加载一个执行DLL函数入口点。

什么是DLL?

DLL文件是二进制文件,可以包含可执行代码和资源,如图像等。与应用程序不同,它们不能直接执行,但应用程序将在需要时加载它们(或在启动期间一次性加载)。

它们重要吗?

大多数应用程序将在启动时加载所需的DLL文件。如果没有找到其中任何一个,系统将根本无法启动该进程。

DLL文件可能需要其他DLL文件

与应用程序需要DLL文件一样,DLL文件本身也可能依赖于其他DLL文件。如果在依赖链中没有找到其中一个DLL文件,则应用程序将无法加载。这很容易使用任何依赖项行走工具进行调试,比如依赖沃克

系统文件夹中有很多这样的文件

大多数系统功能以DLL文件的形式公开给用户程序,因为它们是共享代码/资源的标准形式。每个功能分别保存在不同的DLL文件中,以便只加载所需的DLL文件,从而减少对系统的内存限制。

已安装的应用程序也使用DLL文件

DLL文件也成为一种物理上分离功能的形式,如上所述。好的应用程序还尽量在绝对需要DLL文件时才加载DLL文件,这样可以减少内存需求。这也会导致应用程序附带大量DLL文件。

DLL地狱

但是,有时当共享DLL文件与需要它们的程序之间的版本不匹配时,系统升级通常会破坏其他程序。系统检查点和DLL缓存等是M$解决这个问题的举措。. net平台可能根本不会面临这个问题。

我们如何知道DLL文件中有什么?

你必须使用像DUMPBIN或Dependency Walker这样的外部工具,它不仅会显示DLL文件中包含哪些公开可见的函数(称为导出),还会显示它需要哪些其他DLL文件,以及该DLL文件依赖于哪些从这些DLL文件中导出。

我们如何创建/使用它们?

请参考供应商提供的编程文档。对于c++,请参考MSDN中的LoadLibrary

DLL是文件扩展名&称为“动态链接库”的文件格式,用于保存Windows程序的多个代码和程序。软件,游戏运行在DLL文件的基础上;DLL文件被创建,以便多个应用程序可以同时使用它们的信息。

如果你想获得更多关于DLL文件的信息或面临任何错误,请阅读以下帖子。 https://www.bouncegeek.com/fix-dll-errors-windows-586985/ < / p >

根据微软

动态链接库是包含应用程序运行所需的数据、代码或资源的文件。这些文件是由windows生态系统创建的,可以在两个或多个应用程序之间共享。

当一个程序或软件在Windows上运行时,应用程序的工作方式在很大程度上取决于该程序的DLL文件。例如,如果一个特定的应用程序有几个模块,那么每个模块之间的交互方式由Windows DLL文件决定。

如果你想要详细的解释,查看这些有用的资源

__abc0, __abc1