地址空间中。可以用两种方法进行这项操作 。第一种方法是让应用程序的源代码只引用 DLL
中包含的符号。这样,当应用程序启动运行时,加载程序就能够隐含加载(或链接)需要的
DLL 。第二种方法是在运行时让应用程序显式加载需要的 DLL 并且显式链接到需要的输出符
号。换句话说,当应用程序运行时,其中的线程决定它是否要调用 DLL 中的函数。该线程可
以将 DLL 显式加载到进程的地址空间,获得 DLL 中包含的函数的虚拟内存地址,然后使用
该内存地址调用该函数。该方法的一切操作都是在应用程序运行时进行的。
当线程加载动态链接库的时候,是按照下面的搜索顺序查找并加载动态链接库文件的。
o 当前目录下(首先将动态链接库拷贝至 DEBUG 目录下,因为可执行文件在该目录下)。
o Windows 目录。
o Windows 系统目录。
o PATH 环境变量中设置的目录。
o 列入映射网络的目录表中的目录。
下面将介绍隐式链接和显式链接这两种调用 DLL 的方式。
10。3。1 隐式链接
如果程序员采用隐式链接方式建立一个 DLL 文件,链接程序会自动生成一个与之对应的
LIB 导入文件。该文件包含了每一个 DLL 导出函数的符号名和可选的标识号,但是并不含有
LIB 文件作为 DLL 的替代文件被编译到应用程序项目中。当程序员通过静态链
实际的代码。
接方式编译生成应用程序时,应用程序中的调用函数与 LIB 文件中导出符号相匹配,这些符
号或标识号进入生成的 EXE 文件中。LIB 文件中也包含了对应的 DLL 文件名(但不是完全
的路径名),链接程序将其存储在 EXE 文件内部。当应用程序运行过程中需要加载 DLL 文件
时,Windows 根据这些信息发现并加载 DLL ,然后通过符号名或标识号实现对 DLL 函数的
动态链接。
下面的例子通过隐式链接调用 MyDll。dll 库中的 Min 函数。首先生成一个 TestDll 项目,
在 DllTest。h 、DllTest。cpp 文件中分别输入如下代码:
//Dlltest。h
#pragma ment(lib ,〃MyDll。lib〃)
extern 〃C〃_declspec(dllimport) int Max(int a;int b);
extern 〃C〃_declspec(dllimport) int Min(int a;int b);
//TestDll。cpp
#include〃Dlltest。h〃
void main()
{
int a;
a=min(8;10);
·257 ·
…………………………………………………………Page 269……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
printf(〃 比较的结果为%dn〃,a);
}
在创建 DllTest。exe 文件之前,要先将 MyDll。dll 和 MyDll。lib 拷贝到当前工程所在的目
录下,也可以拷贝到 windows 的 System 目录下。如果DLL 使用的是 DEF 文件,要删除 TestDll。h
文件中关键字 extern 〃C〃 。TestDll。h 文件中的关键字 Progam mit 是要 Visual C++ 的编译器
在 link 时,链接到 MyDll。lib 文件。当然,开发人员也可以不使用#pragma ment(lib ,
〃MyDll。lib〃)语句,而直接在工程的 Setting→Link 页的 Object/Moduls 栏填入 MyDll。lib 即可。
10。3。2 显式链接
显式链接方式对于集成化的开发语言(例如 Visual Basic )比较适合。有了显式链接,程
序员就不必再使用导入文件,而是直接调用 Win32 的 LoadLibary 函数,并指定 DLL 的路径
作为参数。LoadLibary 返回 HINSTANCE 参数,应用程序在调用 GetProcAddress 函数时使用
这一参数。GetProcAddress 函数将符号名或标识号转换为 DLL 内部的地址。假设有一个导出
如下函数的 DLL 文件:
extern 〃C〃 __declspec(dllexport) double SquareRoot(double d);
在隐式链接方式中,所有被应用程序调用的 DLL 文件都会在应用程序 EXE 文件加载时
被加载在到内存中 。但如果采用显式链接方式,程序员可以决定 DLL 文件何时加载或不加载。
显式链接在运行时决定加载哪个 DLL 文件。例如,可以将一个带有字符串资源的 DLL 模块
以英语加载,而另一个以西班牙语加载。应用程序在用户选择了合适的语种后再加载与之对
应的 DLL 文件。
在显式链接方式中,应用程序在执行过程中随时可以加载 DLL 文件,也可以随时卸载
DLL 文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,更适合解释性语
言。不过实现显式链接比较复杂,除了要调用特定的Win32 的LoadLibrary 函数动态链接DLL ,
在应用程序退出之前,还应该用 FreeLibrary 或 MFC 提供的 AfxFreeLibrary 释放动态链接库。
下面是通过显式链接调用 DLL 中的 Max 函数的例子,代码如下:
#include …
void main(void)
{
typedef int(*pMax)(int a;int b);
typedef int(*pMin)(int a;int b);
HINSTANCE hDLL;
PMax Max;
HDLL=LoadLibrary(〃MyDll。dll〃);//加载动态链接库 MyDll。dll 文件;
Max=(pMax)GetProcAddress(hDLL;〃Max〃);
A=Max(5;8);
printf(〃 比较的结果为%dn〃,a);
FreeLibrary(hDLL);//卸载 MyDll。dll 文件;
}
在上面的程序片断中使用类型定义关键字 typedef ,定义指向和 DLL 中相同的函数原型
·258 ·
…………………………………………………………Page 270……………………………………………………………
第 10 章 动态链接库
指针,然后通过 LoadLibray()将 DLL 加载到当前的应用程序中并返回到当前 DLL 文件的句
柄,然后通过 GetProcAddress()函数获取导入到应用程序中的函数指针。函数调用完毕后,使
用 FreeLibrary()卸载 DLL 文件。在编译程序之前,首先要将 DLL 文件拷贝到工程所在的目
录或 Windows 系统目录下。
使用显式链接应用程序编译时不需要使用相应的 LIB 文件。另外,使用 GetProcAddress()
函数时,可以利用 MAKEINTRESOURCE() 函数直接使用 DLL 中函数出现的顺序号,如将
GetProcAddress(hDLL;〃Min〃) 改 为 GetProcAddress(hDLL;MAKEINTRESOURCE(2)) ( 函 数
Min()在 DLL 中的顺序号是 2 ),这样调用 DLL 中函数的速度将会很快,但是要记住函数的使
用序号,否则会发生错误。
10。4 开发 DLL
在 Visual C++6。0 开发环境下,打开“FileNewProject ”选项,可以通过选择 Win32
Dynamic…Link Library 或 MFC AppWizard'dll' 的不同方式来创建 Non…MFC Dll 、Regular Dll 、
Extension Dll 等不同种类的动态链接库。
10。4。1 创建 Non…MFC DLL 动态链接库
每一个 DLL 必须有一个入口点,这就像用 C 编写的应用程序一样,必须有一个 WinMain
函数一样。在 Non…MFC DLL 中 DllMain()是一个默认的入口函数,不需要编写自己的 DLL
入口函数,用 DllMain()函数就能使动态链接库在被调用时得到正确的初始化。如果应用程序
的 DLL 需要分配额外的内存或资源时
小说推荐
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 最新章:第4章
- oracle从入门到精通(PDF格式)
- -Page 1-Oracle 从入门到精通-Page 2-资源来自网络,仅供学习 Oracle 从入门到精通一、SQL 8
- 最新章:第37章
- php程序设计简明教程(DOC格式)
- -Page 1-PHP 程序设计简明教程PHP 讲义 第 1 页 共 90 页-Page 2-目录序 4第一章 PHP 简介 6
- 最新章:第31章
- VB2008从入门到精通(PDF格式英文版)
- -Page 1(R)The eXperT’s Voice inBeginningVB 2008From Novice to ProfessionalChristian Gross-Page 2-Page 3-Beginning VB 2008From Novice to Professional■C
- 最新章:第214章
- C语言设计
- 作者:谭浩强1 C 语言概述1.1 C语言的发展过程1.2 当代最优秀的程序设计语言1.3 C语言版本1.4 C语言的特点1.5 面向对象的程序设计语言1.6 C和C+1.7 简单的C程序介绍1.8 输入和输出函数1.9 C源程序的结构特点1.10书写程序时应遵循的规则1.11C语言的字符集1.12
- 最新章:第45章
- 设计成婚:不入豪门
- 作者:海未央《设计成婚2:名门新娘》作品介绍《名门新娘》介绍:她是骆家收养的孤女,性格因为受他的影响,变得有些古灵精怪,也懂得是非之分!他说他的一切只为他而努力,可是为什么要拒绝自己呢?什么?没有满十八岁?那今天生日,够十八岁了吧?什么,还太小?太过分了,这不是耍着自己玩吗?嘿嘿,有个邪恶的老师,那
- 最新章:第196章
- 玄学,从入门到放弃
- 《玄学,从入门到放弃》作者:李传言文案:周诣一手拿着卜卦,一手拿着《演员的自我修养,叹息良久。他本是百年前观天占星的玄术师,谁知却一朝重生现代。他只想平淡地生活下去,可天不遂人愿,他注定将在这末法时代掀起波澜!成就一代影帝!谢千仇沉默地看着他…大师,你卦和书都拿倒了#玄学,从入门到放弃,入土,删库跑
- 最新章:第86章
- C语言实例教程(PDF格式)
- -Page 1-前 言Visual C+是开发运行于Windows 95和Windows NT环境下的Win32应用程序的可视化编程工具中最重要的成员之一,它为软件开发人员提供了完整的编辑、编译和调试工具和建立于Win32 API(ApplicationProgramming Interface)基
- 最新章:第143章
- 要你言听计从
- 作者:决明第一章哈士奇,没有护卫看家的本领,对主人、客人甚至是闯空门的恶人都一样友善,咬着皮球跟小偷一块玩你丢我捡也不用太惊讶,时常被人认为忠诚度不足。贺世祺背靠在冰冷玻璃落地窗前,一整间屋子都是伸手不见五指的黑暗,也好,反正他现在什么也不需要看到,只要耳朵还有听觉就好,顺便听听贴在耳边的手机里还要
- 最新章:第28章