DLL(Dynamic Link Library,动态链接库)是微软公司为Windows和OS/2操作系统设计一种供应用程序在运行时调用的共享函数库。DLL是应用程序的一种扩展,也是软件共享和重用的传统方法。
DLL除了可同时被多个应用程序共享外,还可以在不改变调用接口(从而不需修改使用它的应用程序)的情况下,改进和升级里面的库函数。而且DLL与编写它的语言无关,例如,用VC生成的规则DLL,可以被VB、Delphi等生成的应用程序使用。
DLL可以用多种语言和工具编写,我们这里只介绍如何使用MFC来编写和使用DLL。相关说明文档位于MSDN帮助的“目录/开发工具和语言/Visual Studio/Visual C++/常见编程方法/DLL/”中。
静态链接库Lib(Static Link Library),是在编译的链接阶段将库函数嵌入到应用程序的内部。如果系统中运行的多个应用程序都包含所用到的公共库函数,则必然造成很大的浪费。这样即增加了链接器的负担,也增大了可执行程序的大小,还加大了内存的消耗。Lib的好处是应用程序可以独立运行,而不需要在操作系统中另外安装对应的DLL。
而DLL采用动态链接,对公用的库函数,系统只有一个拷贝(一般是位于系统目录的*.DLL文件),而且只有在应用程序真正调用时,才加载到内存。在内存中的库函数,也只有一个拷贝,可供所有运行的程序调用。当再也没有程序需要调用它时,系统会自动将其卸载,并释放其所占用的内存空间。
DLL的缺点是应用程序不能独立运行,需要在操作系统中另外安装对应的DLL。例如,如果你的MFC项目被设置成“在共享DLL中使用MFC”的,则虽然生成的可执行程序很小,但是在其他没有安装Visual C++(运行环境)的机器上是不能直接运行的,需要另外安装MFC的动态链接库(如mfc90.dll)。
使用MFC编写的DLL,可以分成两大类:
l 规则DLL——规则(regular)DLL中所包含的函数,可以被所有Windows应用程序使用;
n 共享MFC——DLL中不包含MFC库函数,需要另外安装MFC动态链接库后才能使用;
n 静态MFC——DLL中包含MFC库函数,可以脱离MFC动态链接库独立使用。
; RegDll.def : 声明 DLL 的模块参数。
LIBRARY "RegDll"
EXPORTS
; 此处可以是显式导出
Add @1
Sub @2
Mul @3
Div @4
Mod @5
extern "C" int Add(int d1, int d2) { return d1 + d2;}
extern "C" int Sub(int d1, int d2) { return d1 - d2;}
extern "C" int Mul(int d1, int d2) { return d1 * d2;}
extern "C" double Div(int d1, int d2) {
if (d2 == 0) {
AfxMessageBox(L"Divided by zero!");
return 0;
}
return (double)d1 / d2;
}
extern "C" int Mod(int d1, int d2) {return d1 % d2;}
使用依赖库时用以下途径
#define DllImport extern "C" _declspec(dllimport)
DllImport int Add(int d1, int d2);
DllImport int Sub(int d1, int d2);
DllImport int Mul(int d1, int d2);
DllImport double Div(int d1, int d2);
DllImport int Mod(int d1, int d2);
扩展DLL——扩展(extension)DLL中所定义的类和函数,只能被所MFC应用程序使用。而且扩展DLL中不能包含MFC库函数,也需要另外安装MFC动态链接库后才能使用。
直接项目库依赖就可以了:
#include "../ExtDll/Compute.h"