DLL文件概述及安装方法

在日常生活中,我们经常在浏览电脑文件,特别是安装某款软件寻找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。




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果你想使用 C 编译器来编译成 DLL 文件,你可以使用下面的步骤: 1. 首先,你需要安装一个 C 编译器,比如 GCC 或者 Microsoft Visual C++。 2. 然后,你需要创建一个 C 源文件,并在文件中编写 DLL 所需的代码。 3. 在命令行中进入到 C 源文件所在的目录。 4. 编译 C 源文件,使用下面的命令: - GCC:gcc -shared -o dllname.dll filename.c - Microsoft Visual C++:cl /LD filename.c 其中,dllname.dll 是你要生成的 DLL 文件的名字,filename.c 是你的 C 源文件的名字。 5. 编译完成后,你就可以在当前目录中找到生成的 DLL 文件。 注意:如果你的 DLL 中使用了其他库,你可能需要在编译命令中指定这些库的路径。例如,如果你的 DLL 中使用了 libm.a 库,你可以使用下面的命令来编译: GCC:gcc -shared -o dllname.dll filename.c -L/path/to/lib -lm Microsoft Visual C++:cl /LD filename.c /path/to/lib/libm.lib 希望这些信息对你有帮助! ### 回答2: 使用C编译器将代码编译成DLL文件的过程相对简单。以下是一些基本步骤: 1. 编写C源代码:首先,你需要编写你希望编译成DLL文件的C源代码。确保代码中包含适当的函数和全局变量定义。 2. 创建函数导出声明:在你的源代码中,你需要为想要在DLL中导出的函数添加导出声明。这可以确保其他程序(如应用程序)能够在运行时调用这些函数。 3. 编译源代码:使用你选择的C编译器,将C源代码编译成对象文件(.obj文件)。使用命令行或集成开发环境(IDE)编译器都可以完成这一步骤。 4. 创建DLL文件:使用C编译器提供的工具(如linker)将对象文件链接到DLL文件中。这些工具的名称和用法可能因不同的编译器而异。 5. 测试DLL文件:在应用程序中使用编译得到的DLL文件,确保功能正常。这可以在开发环境中进行测试,或者在实际应用程序中进行集成测试。 需要注意的是,这只是一个基本的概述。实际上,编译DLL文件可能涉及到更多的步骤和参数设置,具体取决于你所使用的C编译器和开发环境。你可能还需要了解有关链接器和库文件的详细信息,以确保正确地使用和管理DLL文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值