它将显著地节省磁盘和内存空间。同时,无论应用程序是否使用
了MFC,都可以调用非MFC DLL中所导出的函数。
l 如果需要创建使用了MFC的DLL,并希望MFC和非MFC应用程序都能
使用所创建的DLL,那么可以选择的范围包括静态链接到MFC的常
规DLL和动态链接到MFC的常规DLL。动态链接到MFC的常规DLL比较
短小,因此可以节省磁盘和内存,但是,在分发动态链接到MFC的
常规DLL时,必须同时分发MFC的支持DLL,如MFCx0。DLL和
MSVCRT。DLL等。而使用静态链接到MFC的常规DLL则不存在这种问
题。
l 如果希望在DLL中实现从MFC派生的可重用的类,或者是希望在应
用程序和DLL之间传递MFC的派生对象时,必须选择MFC扩展DLL。
第二节 创建和使用动态链接库
本节以非MFC DLL为例来讲解DLL的结构和导出方法,并介绍创建和使
用DLL的方法和步骤。
13。2。1 DLL的结构和导出方式
DLL文件和EXE文件都属于可执行文件,不同的是DLL文件包括了一个
导出表,导出表中给出了可以从DLL中导出的所有函数的名字。外部
可执行程序只能访问包括在DLL的导出表中的函数,DLL中的其它函数
是私有的,不能为外部可执行程序所访问。
可以使用Visual C++提供的DUMPBIN实用程序 (可以在
DevStudioVCbin 目录下找到这个工具)来查看一个DLL文件的结
构。举一个例子,如果需要查看DLL文件msgbox。dll (我们将在本小
节的后续内容中创建该DLL)的导出表,可以在命令提示符下键入下
面的命令:
》dumpbin /exports msgbox。dll
运行结果如下:
Microsoft (R) COFF Binary File Dumper Version 5。00。7022
Copyright (C) Microsoft Corp 1992…1997。 All rights reserved。
Dump of file msgbox。dll
…………………………………………………………Page 665……………………………………………………………
File Type: DLL
Section contains the following Exports for MSGBOX。dll
0 characteristics
351643C3 time date stamp Mon Mar 23 19:13:07 1998
0。00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint name
1 0 MsgBox (00001000)
Summary
7000 。data
1000 。idata
2000 。rdata
2000 。reloc
17000 。text
由上面的结果得知,msgbox。dll中仅包括了一个导出函数MsgBox()。
l 注意:
l 仅仅知道导出函数的名称并不足以从DLL 中导出该函数。若在应用
程序中使用显式链接 (link explicitly),至少还应该知道导出
函数的返回值的类型以及所传递给导出函数的参数的个数、顺序
和类型;若使用隐含链接 (link implicitly),必须有包括导出
函数 (或类)的定义的头文件 (。H文件)和引入库 (import
library,。LIB文件),这些文件是由DLL的创建者所提供的。关
于显式链接和隐含链接,将在本章的 “13。2。2 链接应用程序到
DLL”小节中讲述。
从DLL中导出函数有两种方法:
l 在创建DLL时使用模块定义 (module DEFinition,。DEF)文件。
…………………………………………………………Page 666……………………………………………………………
l 在定义函数时使用关键字__declspec(dllexport)。
下面我们通过一个简单的例子来分别说明两种方法的使用。在这个例
子中,我们将创建一个只包括一个函数MsgBox() 的DLL,函数MsgBox
()用来显示一个消息框,它和Win32 API函数MessageBox()的功能是
一样,只不过在函数MsgBox()中,不需要指定消息的父窗口,而且可
以缺省其它所有的参数。
(1) 使用模块定义文件
模块定义文件是一个文本文件,它包括了一系列的模块语句,这些语
句用来描述DLL的各种属性,典型的,模块语句定义了DLL中所导出的
函数的名称和顺序值。
在讲解模块定义文件之前,我们先创建一个Win32 Dynamic…Link
Library工程。
1。 在Microsoft Developer Studio中选择File菜单下的New命令,在
Projects选项卡中选择Win32 Dynamic…Link Library,并为工程取一
个名字,如msgbox。单击OK后,Visual C++创建一个Win32 DLL的空
白工程,必须手动的将所需要的文件添加到工程中。
2。 单击Project菜单下的Add To Project子菜单下的New命令,在
Files选项卡中选择Text File,在File文本框中输入DEF文件名,如
msgbox。def。
3。 双击Workspace窗口的FileView选项卡中的msgbox。def节点,在
msgbox。def文件中输入下面的内容:
LIBRARY MSGBOX
DESCRIPTION 〃一个DLL的简单例子〃
EXPORTS
MsgBox @1
在DEF文件中的第一条语句必须是LIBRARY语句,该语句表明该DEF文
件属于一个DLL,在LIBRARY之后是DLL的名称,这个名称在链接时将
放到DLL的引入库中。
EXPORTS语句下列出了DLL的所有导出函数以及它们的顺序值。函数的
顺序值不是必须的,在指定导出函数的顺序值时,我们在函数名后跟
…………………………………………………………Page 667……………………………………………………………
上一个@符号和一个数字,该数字即导出函数的顺序值。如果在DEF中
指定了顺序值,它必须不小于1,且不大于DLL中所有导出函数的数
目。
DESCRIPTION语句是可选的,它简单的说明了DLL的用途。
4。 下一步是向工程中添加一个头文件,它定义了DLL中的函数的返回
值的类型和参数的个数、顺序和类型。
单击菜单项Project|Add To Project|New。。。,在Files选项卡下选择
C/C++ Header File,在File文本框中指定头文件名,如msgbox。h
(可以省略后缀名。h)。
在头文件中输入如下的内容:
#include
extern 〃C〃 int MsgBox(
// 消息框的文本
LPCTSTR lpText=〃虽然这个例子有一些幼稚,但它工作得非常的好 !〃;
// 消息框的标题
LPCTSTR lpCaption=〃一个简单的例子〃;
// 消息框的样式
UINT uType=MB_OK);
请注意函数定义前的关键字extern 〃C〃,这是由于我们使用了C++语
言来开发DLL,为了使C语言模块能够访问该导出函数,我们应该使用
C链接来代替C++链接。否则,C++编译器将使用C++的类型安全命名和
调用协议,这在使用C调用该函数时就会遇上问题。在本例中并不需
要考虑到这个问题,因为我们在开发DLL和应用程序时都是使用C++,
但我们仍然强烈建议使用extern 〃C〃,以保证在使用C编写的程序调
用该DLL的导出函数不会遇上麻烦,在本章后面的内容中我们还会讨
论到这个问题。
5。 下面要做的事是向工程中添加一个C++源文件,在该文件中实现函
数MsgBox()。
仿照上面的过程,单击菜单项Project|Add To Project|New。。。,在
Files选项卡下选择C++ Source File,在File文本框中指定源文件
…………………………………………………………Page 668……………………………………………………………
名,如msgbox。cpp。
在msgbox。cpp文件中添加如下的代码:
#include 〃test1。h〃
int MsgBox(LPCTSTR lpText;
LPCTSTR lpCaption;
UINT uType)
{
return MessageBox(NULL;lpText;lpCaption;
小说推荐
- 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章
- JMS简明教程(PDF格式)
- -Page 1-JMS1.1规范中文版卫建军2007‐11‐22-Page 2
- 其他
- 最新章:第28章
- SQL语言艺术(PDF格式)
- -Page 1-SQLSSQQLL语言艺术内容介绍本书分为12章,每一章包含许多原则或准则,并通过举例的方式对原则进行解释说明。这些例子大多来自于实际案例,对九种SQL经典查询场景以及其性能影响讨论,非常便于实践,为你数据库应用维护人员阅读。资深 SQL 专家 Stéphane Faroult倾力打
- 其他
- 最新章:第27章
- 软件工程实践者的思想(PDF格式)
- -Page 1-大 道 至 简—软件工程实践者的思想周爱民(Aimingoo 著-Page 2-序2004 年 11 月初爱民(Aimingoo)第一次把他的书稿给我,我翻看了一下,第一反应讲的是感想。这不错,在技
- 其他
- 最新章:第26章
- asp基础实用教程(DOC格式)
- 目 录一、关于ASP二、ASP的新功能三、创建ASP页四、使用脚本语言五、使用变量和常量六、使用集合七、ASP内建对象八、向浏览器发送内容九、包含文件十、访问数据库十一、调试ASP脚本十二、维护ASP应用程序的安全一、关于ASP Active Server Pages(ASP)是服务器端脚本编写环境
- 其他
- 最新章:第17章
- Linux实用培训教程(PDF)
- -Page 1-rrktqt的个人空间 Linux实用培训教程第一部分 作者:红联Linux实用培训教程第一部分-共三部分解的Linux知识,循序渐进的介绍Linux相关知识,从入门到提高,希望对所有学习Linux的朋友都有帮助 红联Linux论坛是致力于Linux技术讨论的站点,目前网站收录的文章
- 其他
- 最新章:第42章
- php程序设计简明教程(DOC格式)
- -Page 1-PHP 程序设计简明教程PHP 讲义 第 1 页 共 90 页-Page 2-目录序 4第一章 PHP 简介 6
- 其他
- 最新章:第31章
- 路由器基本知识及应用实例(DOC格式)
- 第二章 路由器第一节 路由器发展概述自从1984年问世至今,路由器已经走过了近20年的快速技术发展历程。路由器的应用领域不断扩展、从单一的互通网关逐渐扩展到覆盖广域网、城域网乃至用户接入的各个领域。近年来,路由器早已逐渐脱离单纯用于企业网出口和互联的概念,开始成为运营网络和各种专用业务网络的核心设备
- 其他
- 最新章:第48章
- Java编程思想第4版[中文版](PDF格式)
- -Page 1-Page 2《Thinking In Java》中文版作者:Bruce Eckel主页:http/BruceEckel.编译:Trans Bot主页:http/memberease~transbot致谢-献给那些直到现在仍在孜孜不倦创造下一代计算机语言的人们!指导您利用万维网的语言进
- 其他
- 最新章:第295章