首页 理论教育 VisualC++高级编程技术与实例:开发简单DLL

VisualC++高级编程技术与实例:开发简单DLL

时间:2023-11-16 理论教育 版权反馈
【摘要】:微软Visual C++6.0环境支持多种DLL的开发。在这里,要为读者介绍普通的DLL的开发,它的开发比较简单,至于相对复杂的MFC DLL的开发,将在本章的3.4小节中介绍。下面就是一个普通Win32 DLL 的开发过程,为了能突出重点并方便读者理解,我们对开发中所使用的程序实例作了简化处理。不需要导出的函数我们称之为DLL的内部函数。

VisualC++高级编程技术与实例:开发简单DLL

微软Visual C++6.0环境支持多种DLL的开发。按照DLL是否使用MFC,可以分为两种:普通的Win32的DLL和基于MFC的DLL。两者的区别是前者直接用C语言编写,不能使用MFC类,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用;而后者是用MFC类库编写的,一般被MFC应用程序使用。在这里,要为读者介绍普通的DLL的开发,它的开发比较简单,至于相对复杂的MFC DLL的开发,将在本章的3.4小节中介绍。

下面就是一个普通Win32 DLL 的开发过程,为了能突出重点并方便读者理解,我们对开发中所使用的程序实例作了简化处理。

1. 新建工程项目

使用VC新建一个Win32 Dynamic-Link Library类型的项目,项目名称为NOMFCDLL,如图3-3所示,关于项目的设置选择缺省,即建立一个开发DLL的空项目。

图3-3 创建开发普通DLL的项目

2. 添加DLL的功能文件

当本DLL开发完成并编译后,它要生成必须的三个文件——包含文件即头文件(.H)和导入库文件(.LIB)及实际代码文件(.DLL)。因此,在开发时就要产生该头文件,头文件中包含导出内容。另外的两个文件稍后生成。我们在这里只添加一个Min函数到头文件中,并把函数的实现编写到CPP文件中,该函数功能很简单,就是返回两个整数的较小者。

程序清单3-1是添加到项目中的两个文件及其代码。

程序清单3-1 DLL中函数的声明和实现

在上面的代码中,Min函数的声明与一般的C++函数声明相比,它多了一个修饰词extern “C”。这个修饰词的作用是令C++编译器以C语言的方式对这个函数进行处理,从而使这个函数编译形成可执行代码后能够为C语言和C++语言甚至其它语言所使用。

3. 导出函数(或其它数据)

接下来,就要安排开发DLL的程序中哪些内容需要导出,在DLL中,导出的内容可以包括函数、类和各类资源等。它们的导出设计是一样的。要导出函数、类或者其它数据,实现方法有两种,一是在定义这些要导出的内容时使用导出关键字_declspec(dllexport),另外一种方法是在DLL项目中加入模块定义文件.DEF。需要读者注意的是在使用第一种方法的时候,不能使用DEF文件。下面就通过两个例子来说明如何使用这两种方法导出我们的函数Min。

(1)使用模块定义文件DEF导出函数。

首先在项目中添加一个文本文件(Text File),命名为NOMFCDLL.DEF,然后进行编辑,录入下面的内容并保存:(www.xing528.com)

上面的DEF文件内容就是DLL的模块定义文件的一般格式。其中,第一个语句必须是LIBRARY语句,它标识该DEF文件属于哪个DLL,LIBRARY语句的后面是DLL的名称NOMFCDLL,本项目编译链接时,链接程序会把该名称放到导入库文件中。因为我们的项目名称是NOMFCDLL,编译时会产生NOMFCDLL.DLL库文件,所以“NOMFCDLL”必须加到LIBRARY语句之后,这样,在导入库文件(LIB)中的信息才能正确地联系到实际代码文件DLL上。

第二个语句是DLL用途描述语句,不起实际作用,这个语句可以省略。

第三个语句EXPORTS是DEF文件的核心,它用于列举导出内容,对于导出函数EXPORTS语句还允许给函数编号(从1到n),编号前要有个@,编号也是可以省略的。实际上,EXPORTS的完整语法格式是这样的:

其中,Entryname是导出的函数或者数据的名称(Internalname同Entryname);@ordinal表示在导出表中的顺序号(Index),NONAME仅仅在按顺序号导出时被使用(如果希望优化DLL文件的大小,可以使用NONAME属性,此时,序号而非函数名存储在DLL的导出表中,这样可以节省很多空间);DATA表示导出的是数据。上述各项中,只有Entryname或者序号有一项是必须的,其它可以省略。

(2)使用关键字_declspec(dllexport)导出函数。

我们可以使用另一种方法导出函数或者数据。这种方法比使用DEF模块定义文件的方法简单,就是在需要导出的内容前面加上关键字_declspec(dllexport)即可。本例要导出Min函数,所以要修改min.h文件。

当然,DLL开发程序中的内容是根据需要导出的,有一些函数仅仅是为了其它函数的实现而实现的,也就是说,它们是被其它函数调用而完成特定功能的,对于使用DLL的应用程序而言,它们没有使用价值,那么,这样的函数就不需要导出,虽然它们经过编译之后所产生的可执行代码也在DLL中。不需要导出的函数我们称之为DLL的内部函数。

进行DLL内容的导出要注意一点,上面介绍的两种导出方法不能混合使用!如果要在我们的程序中要使用关键字_declspec(dllexport)导出Min函数,就要把已经添加的DEF文件删除或者修改扩展名

4. 创建DLL和LIB文件

把需要的内容导出后,就可以Build项目,此时,会在Debug文件夹下产生实际代码文件NOMFCDLL.DLL 和导入库文件NOMFCDLL.LIB。

这个简单的例程到此为止就完成了。可是,所产生的动态链接库究竟好不好用呢?还要建立一个使用程序来验证一下NOMFCDLL.DLL的可用性

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈