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

时间:2008-09-23 23:33:39

标签: windows winapi dll

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

那么,与他们的交易是什么?

9 个答案:

答案 0 :(得分:247)

什么是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:

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

进一步阅读:

请检查MSDNWikipedia以便进一步阅读。也是这个答案的来源。

答案 1 :(得分:34)

什么是DLL?

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

这些重要吗?

大多数应用程序将加载启动时所需的DLL文件。如果找不到任何这些,系统根本无法启动该过程。

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

与应用程序需要DLL文件的方式相同,DLL文件可能依赖于其他DLL文件本身。如果未找到依赖链中的这些DLL文件之一,则不会加载应用程序。这可以使用任何依赖性walker工具轻松调试,例如Dependency Walker

系统文件夹中有这么多

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

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

如上所述,DLL文件也成为物理上分离功能的一种形式。好的应用程序也会尝试在绝对需要之前不加载DLL文件,这会降低内存需求。这也会导致应用程序附带大量DLL文件。

DLL地狱

但是,当共享DLL文件与需要它们的程序之间存在版本不匹配时,系统升级有时会破坏其他程序。系统检查点和DLL缓存等已经从M $中解决了这个问题。 .NET平台可能根本不会遇到这个问题。

我们如何知道DLL文件中的内容?

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

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

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

答案 2 :(得分:13)

假设您正在创建一个使用库中的某些函数的可执行文件。

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

现在,如果运行此可执行文件,则它具有所需的一切,因此可执行加载程序只是将其加载到内存中并运行它。

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

现在,如果运行此可执行文件,则缺少可执行文件的位(即存根),因此加载程序会通过可执行文件修复缺少的存根。只有在解析了所有存根之后才允许运行。

要查看此操作,请删除或重命名DLL,并观察加载程序在尝试运行可执行文件时如何报告缺少的DLL错误。

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

最后一点,如果你没有链接到DLL那么链接器就不会插入任何存根,但是Windows仍然提供了 GetProcAddress API,允许你加载执行DLL可执行文件启动后很长时间的函数入口点。

答案 3 :(得分:12)

DLL(动态链接库)和SL(共享库,在UNIX下等效)只是可执行代码库,可以在加载时动态链接到可执行文件中。

静态库在编译时插入到可执行文件中,并从该点开始修复。它们增加了可执行文件的大小,无法共享。

动态库具有以下优点:

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

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

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

答案 4 :(得分:10)

DLL文件包含导出表,这是一个可由调用程序查找的符号列表。符号通常具有C calling convention__stcall)的函数。导出表还包含函数的地址。

使用此信息,调用程序可以调用DLL中的函数,即使它在编译时无法访问DLL。

Introducing Dynamic Link Libraries 有更多信息。

答案 5 :(得分:6)

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

  

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

     

通过使用DLL,程序可以   模块化为单独的组件。   例如,会计程序可以   由模块出售。每个模块都可以   在运行时加载到主程序中   安装该模块的时间。   因为模块是分开的,所以   程序的加载时间更快,   并且只在那时加载模块   请求功能。

     

此外,更新更容易   适用于每个模块而不会影响   该计划的其他部分。对于   例如,您可能有工资单   计划,税率各变化   年。当这些变化被隔离时   到DLL,您可以应用更新   无需构建或安装   整个节目再次。

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

答案 6 :(得分:2)

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

如果您想获取有关DLL文件的更多信息或遇到任何错误,请阅读以下帖子。 https://www.bouncegeek.com/fix-dll-errors-windows-586985/

答案 7 :(得分:1)

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

答案 8 :(得分:1)

根据Microsoft

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

当程序或软件在Windows上运行时,应用程序的大部分工作方式取决于该程序的DLL文件。例如,如果特定应用程序具有多个模块,则每个模块之间的交互方式由Windows DLL文件确定。

如果要详细说明,请查看这些有用的资源

What are dll filesAbout Dll files