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

那么,他们是怎么回事?


当前回答

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

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

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

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

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

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

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

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

其他回答

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

什么是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中的这个位置。

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

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

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

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

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

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

什么是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或维基百科。这也是答案的来源。