库结构,直接用C 语言编写的DLL,其输出的
函数一般用的是标准C 接口,并能被非MFC 或MFC 编写的应用程序所调用。
? Regular DLL:和下述的Extension Dlls 一样,是用MFC 类库编写的。其特点是在源文
件里有一个继承CWinApp 的类。其又可细分成静态连接到MFC 和动态连接到MFC
上的。但静态连接到MFC 的动态链接库只被Visual C++的专业版和企业版所支持。
? Extension DLL:用来实现从MFC 所继承下来的类的重新利用,也就是说,用这种类
型的动态链接库,可以用来输出一个从MFC 所继承下来的类。Extension DLL 使用
MFC 的动态连接版本所创建的,并且它只被用MFC 类库所编写的应用程序所调用。
10.2 DLL 的出入口函数
DllMain()函数是DLL 模块的默认入口点。当Windows 加载DLL 模块时调用这一函数。
系统首先调用全局对象的构造函数,然后调用全局函数DllMain()。DllMain()函数不仅在将
DLL 链接加载到进程时被调用,在DLL 模块与进程分离时(以及其他时候)也被调用。
DLL 文件中包含一个导出函数表。这些导出函数由它们的符号名和称为标识号的整数与
外界联系起来。函数表中还包含了DLL 中函数的地址。当应用程序加载DLL 模块时,它并
不知道调用函数的实际地址,但它知道函数的符号名和标识号。动态链接过程在加载DLL
模块时动态建立一个函数调用与函数地址的对应表。如果重新编译和重建DLL 文件,并不需
要修改应用程序,除非改变了导出函数的符号名和参数序列。
简单的DLL 文件只为应用程序提供导出函数,比较复杂的DLL 文件除了提供导出函数
枫叶文学网www.fywxw.com
第10 章 动态链接库
·253·
以外,还调用其他DLL 文件中的函数。这样,一个特殊的DLL 既有导入函数,又有导出函
数。这并不是一个问题,因为动态链接过程可以处理jiāo叉相关的情况。
在DLL 代码中,声明导出函数的代码如下:
__declspec(dllexport) int MyFunction(int n);
但也可以在模块定义(DEF)文件中列出导出函数,不过这样做常常引起更多的麻烦。在
应用程序方面,声明相应的输入函数,代码如下:
__declspec(dllimport) int MyFuncition(int n);
仅有导入和导出声明并不能使应用程序内部的函数调用链接到相应的DLL 文件上。应用
程序的项目必须为链接程序指定所需的输入库(LIB 文件)。而且应用程序事实上必须至少包
含一个对DLL 函数的调用。本节将对DLL 的DllMain()入口函数和导出函数作相关的介绍。
10.2.1 DllMain()函数
每一个DLL 必须有一个入口点,这就象用C 编写的应用程序一样,必须有一个WinMain
函数一样。在Non-MFC DLL 中DllMain()是一个默认的入