在日常生活中,我们经常在浏览电脑文件,特别是安装某款软件寻找bin文件夹里的setup时(这里专指使用windows系统的用户,linux大神别处走),碰到.dll文件。看懂世界需要一双善于怀疑的眼睛,那么,这个.dll文件到底是什么,有什么用呢?

“DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。 ”                                                                                        --摘自百度百科

上述解释可能会显得较为晦涩,我们可以这样想,在一个操作系统里,各个模块之间是如何调用的呢,手头的模块想要实现一个其他极其普通的功能,难道每开发一个模块,就要重新再写一遍代码吗?DLL文件便是用来解决这个问题,它里面存放的是某个小函数的实现过程,当程序需要调用时就载入DLL文件获取函数地址。这样做的好处是非常直观的,当运行某个程序时不需要一开始就加载所有代码,只有在需要的时候才载入DLL文件,节省了时间和空间。

如何加载DLL文件呢?常用的两种链接方法是加载时动态链接和运行时动态链接。

在运行时动态链接中,应用程序调用 LoadLibrary 函数或 LoadLibraryEx 函数以在运行时加载 DLL。成功加载 DLL 后,可以使用 GetProcAddress 函数获得要调用的导出的 DLL 函数的地址。在使用运行时动态链接时,无需使用 导入库文件。
Win32 DLL中函数DLLMain来实现一个进程或 线程载入和 卸载DLL,它的原型是BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved);
其中,第一个参数表示DLL的实例句柄;第三个参数系统保留;这里主要介绍一下第二个参数,它有四个可能的值:DLL_PROCESS_ATTACH(进程载入),DLL_THREAD_ATTACH( 线程载入),DLL_THREAD_DETACH(线程 卸载),DLL_PROCESS_DETACH(进程卸载),在DLLMain函数中可以对传递进来的这个参数的值进行判别,并根据不同的 参数值对DLL进行必要的初始化或清理工作。在Win32环境下,所有应用程序都有自己的私有空间,每个进程的空间都是相互独立的,这减少了应用程序间的相互影响,但同时也增加了编程的难度。大家知道,在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的;而在Win32环境中,情况却发生了变化,当进程在载入DLL时,系统自动把DLL 地址映射到该进程的私有空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间,也就是说每个进程所拥有的相同的DLL的全局数据其值却并不一定是相同的。因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。亦即把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。
那么如果DLL文件失效,损坏或者丢失了该怎么办呢?推荐一款软件DependencyWalker。当然别忘了windows系统盘里的修复功能。
顺便补充一下,在linux系统里虽然不用DLL,但用so,DLL和so都是共享的程序库。由于DLL的文件结构和Linux与Windows的系统调用不同,DLL在Linux中(一般)不能使用。除非在Linux中使用Win32模拟程序如Wine,才能(部分)支持DLL。




Logo

更多推荐