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

那么,他们是怎么回事?


当前回答

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

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

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

其他回答

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

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

什么是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(动态链接库)和SLs(共享库,在UNIX下是等价的)只是可执行代码的库,可以在加载时动态链接到可执行文件。

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

动态库有以下优点:

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

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

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

根据微软

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

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

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

什么是dll文件,关于dll文件

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