动态链接库(DLL)是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。
动态链接库的优点:
1、扩展了应用程序的特性;
2、可以用许多种编程语言来编写;
3、简化了软件项目的管理;
4、有助于节省内存;
5、有助于资源共享;
6、有助于应用程序的本地化;
7、有助于解决平台差异;
8、可以用于一些特殊的目的。windows使得某些特性只能为DLL所用。
动态链接库由全局数据、服务函数和资源组成。它可以有自己的数据段,但没有自己的堆栈,使用的堆栈是调用它的应用程序的堆栈。DLL的编制与具体的编程语言及编译器无关。
调用方式:
1、静态调用方式:在应用程序运行的时候把,DLL的实例加载到内存中,在应用程序结束的时候卸载DLL,如果还有其他程序使用该DLL,操作系统则将DLL的引用减1,知道所有相关程序结束对该DLL的调用时才释放它。这种方式简单,但不够灵活。
静态加载------程序静态编译的时候就静态导入dll,这样的话就需要提供给库使用者(C客户)如下文件:*.lib文件和.dll文件和*.h。其有2个坏处:
(1)程序一开始运行就需要载入整个dll,无法载入程序就不能开始运行;
(2) 由于载入的是整个dll,需要耗费资源较多
可以使用Class method。
其调用方法如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")
2、动态调用方式:使用API函数,加载和卸载DLL。使用上复杂,但能更加有效地使用内存,是编写大型应用程序的重要方式。
动态加载-----那么只需要提供dll文件。
因此调用程序若想调用 DLL 中的某个函数就要以某种形式或方式指明它到底想调用哪一个函数。但是无法调用 Class method 。如果要调用 Dll 中的 function, 需要经历 3 个步骤:
1、Handle h=LoadLibrary(dllName)
2、GetProcAddress(h,functionName)返回函数指针,通过函指针调用其function
3、FreeLibrary(h)
Windows下搜索定位DLL的默认顺序(也是安全DLL搜索模式):
1、内存。2、KnownDLLs(KnownDlls是windows下的一种用来缓存经常用到的DLL文件的机制。更准确地说,是被用来加快应用程序对DLL文件的加载速度的机制)。3、清单与.local。4、应用程序目录。5、当前工作目录(进行某项操作的目的目录,会随着OpenFileDialog、SaveFileDialog等对象所确定的目录而改变。)。6、系统目录。7、路径变量。
也可以使用SetDllDirectory函数来改变标准搜索顺序。
静态链接库
静态链接库的扩展名为.lib。使用静态链接库的应用程序是从函数库中得到所引用的函数的执行代码,然后把执行代码放进程序自身的执行文件中,这样,应用程序在运行时就可以不再需要静态函数库的支持了,通常库中存放是常见的数学函数等。
静态链接库和动态链接库的一个区别是静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
现在静态链接库使用的较少。