DLL(Dynamic Linkable Library)动态链接库
1、使用动态链接库的优点:
(1)减少内存空间要求:应用程序在运行时,只有当EXE程序确定要调用某些DLL模块时,系统才将它们装载到内存空间中。
(2)DLL模块可以被多个应用程序使用。
(3)只要函数声明中参数不改变,动态链接库中的函数体可以随意改变,调用该函数的应用程序不需要重新编译
2、DLL与LIB的异同
LIB为静态链接库,与动态链接库相似之处在于,他们都是可以执行代码及数据,放在库中,供应用程序调用。其区别在于
(1)静态链接库编译时为应用程序提供的是所引用函数的执行代码,程序在运行时就不在需要静态函数库的支持
(2)应用程序在使用DLL时,只包括了用于从DLL中所引用的函数信息,没有函数的具体实现。只有在运行时,才从DLL中获取函数的实现。
(3)静态链接库编译时拷贝一份库的代码,只用于该应用程序;动态链接库运行时才链接库,可以与其他应用程序共享库中函数和资源,不管有多少进程访问DLL,同一个DLL在内存中仅有一份。因此在内存消耗上动态链接库要比静态链接库小。
(4)静态链接库中不能包括其他的动态或静态的链接库,而动态链接库中还可以再包含其他的动态或静态链接库。
(5)使用静态链接库,应用程序比较大,但是比较完整,从一台机器复制到另一台机器可以直接运行;使用动态链接库必须包含其他的动态或静态链接库。
3、VC6.0 实现DLL
VC6.0支持自动生成两种DLL:Win32 DLL 和 MFC AppWizard DLL
(1)Win32 DLL 即 Win32 Dynamaic Link Library 共有三种DLL工程,没有什么区别,一般选择空工程(An empty DLL project)即可
(2)MFC DLL 也有三种形式,这种DLL可以使用和继承已有的MFC类:
Regular DLL with MFC statically linked(常规静态链接MFC DLL):编译时将MFC代码加入到DLL中,使用该DLL时不需要MFC类库的支持,但文件比较大
Regular DLL using shared MFC DLL (常规动态链接MFC DLL):动态链接到MFC类库中,因此减少空间占用,但运行时依赖MFC类库。它可以被任何Win32程序使用,包括使用MFC的应用程序。
MFC Extension DLL(扩展MFC DLL):用来实现从MFC所继承下来类的重新利用。它可以输出一个从MFC所继承下来的类。它只能被使用MFC且动态链接到MFC的应用程序使用。
4、DLL的动态链接方法
DLL的开发就是应用程序中的导入函数与DLL文件中的导出函数进行链接,链接方式包括隐式链接和显示链接两种。
隐式链接:也叫加载时动态链接,由编译系统完成对DLL的加载,应用程序结束时DLL卸载(有其他应用程序,则Windows系统duiDLL的应用记录减1,直到所有相关程序都结束对该DLL的使用时,才释放)。
显示链接:也叫运行时动态链接,用API函数加载和卸载DLL。这种方式能更加有效的使用内存
5、DLL文件构成
发布动态链接库需要三个文件:头文件(.h),导入库文件(.lib)和实际代码文件(.dll)
头文件 定义DLL能导出的函数、数据结构或类的声明;
导入库文件 扩展名与静态链接库的扩展名一样,但是它不同于静态链接库文件。该文件中包含了调用DLL的隐式链接,即加载时动态链接的信息。
实际代码文件中包含DLL真正的可执行代码。
一般情况下,使用Visual C++开发应用程序在需要加载DLL时,该DLL的包含文件(.h)和实际代码文件(.dll)都是要用到的。如果采用加载时动态链接DLL的方式,则导入库文件也是必要的。当工程被编译成可执行文件时,只需要(.exe)和(.dll)即可运行。