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

Windows 什么是DLL文件,它们是如何工作的?,windows,winapi,dll,Windows,Winapi,Dll,DLL文件究竟是如何工作的?它们似乎有很多,但我不知道它们是什么,也不知道它们是如何工作的 那么,如何处理它们呢?什么是DLL? 动态链接库(DLL)与EXE类似,但它们不是直接可执行的。它们类似于Linux/Unix中的.so文件。也就是说,DLL是MS对共享库的实现 DLL非常类似于EXE,因此文件格式本身是相同的。EXE和DLL都基于可移植可执行文件(PE)格式。DLL还可以包含COM组件和.NET库 DLL包含什么? DLL包含EXE或其他DLL使用的函数、类、变量、UI和资源(如图标、

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:

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

进一步阅读:

请检查或进一步阅读。还有这个答案的来源。

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

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

通过使用DLL,程序可以 模块化为单独的组件。 例如,会计程序可以 按模块销售。每个模块都可以 在运行时加载到主程序中 如果安装了该模块,则为时间。 因为模块是分开的,所以 程序的加载时间更快, 而模块仅在以下情况下加载: 请求功能

此外,更新更容易进行 适用于每个模块而不影响 计划的其他部分。对于 例如,您可能有一份工资单 程序,税率会随之变化 一年。当这些变化被隔离时 对于DLL,可以应用更新 无需构建或安装 整个节目又开始了


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

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

有更多信息。

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

静态库是在编译时插入到可执行文件中的,并且从那时起是固定的。它们会增加可执行文件的大小,并且无法共享

动态库具有以下优点:

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

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


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

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

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

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

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

现在,如果运行这个可执行文件,则会丢失可执行文件的位(即存根),因此加载程序会遍历该可执行文件以修复丢失的存根。只有在所有存根都已解析之后,可执行文件b