《关于DLL的VC++程序编程方法.pdf》由会员分享,可在线阅读,更多相关《关于DLL的VC++程序编程方法.pdf(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 文章编号:1006-4729(2001)04-0051-04收稿日期:2001-05-16关于DLL的VC+程序编程方法方 莉,林中达(东南大学 动力工程系,南京 210096)摘 要:简要介绍了利用动态链接库(DLL)输出类、函数、变量的各种方法,以及如何简便地将DLL与用户应用程序相链接,并对所讨论的方法,全部配有VC+实例说明.关键词:动态链接库;类;函数;变量;输出;链接中图分类号:TP315 文献标识码:A引 言动态链接库(DLL)是一种基于Windows的程序模块.它不仅可以包含可执行代码,而且还有数据,各种资源,因而扩大了库文件的使用范围.在进行大型软件开发时,利用DLL技术将
2、程序分为一系列的主程序和DLL,可以减少开发的工作量.由于每个模块减少了,访问的速度将提高.DLL程序本身不能运行,它需要一个入出口函数,在应用程序使用DLL的内容前,系统先调用入出口函数完成DLL的初始化和终止工作.此外,设计的这个DLL对外提供了哪些功能、接口如何定义后,DLL内部实现就和其他普通程序设计没有什么两样.使用DLL的动态链接并不是将库代码拷贝,而是在程序中记录了函数的入口点和接口,在程序执行时才将库代码装入内存.不管多少程序使用DLL,内存中都只有一个DLL的副本,当没有程序使用它时,系统就将它移出内存.可见,灵活使用DLL将可实现数据和资源共享,避免重复代码造成的磁盘和内存
3、资源浪费.此外,由于DLL独立于链接它们的应用程序,调用的地址转换是在加载时解决的.这使得DLL的故障查找和小的修改比较简单,不必重新编译调用它们的应用程序.通过DLL可以输出类、函数、变量.笔者结合自己在使用DLL的过程中所遇的问题,对如何实现上述输出内容以及将DLL与用户应用程序相链接的原理和方法进行探讨.1DLL输出及方法1.1 输出类1.1.1 利用宏AFEXTCLASS输出类1新建一个工程时,使用MFC AppWizard(dll)自动创建DLL.AppWizard允许建立两种DLL,即扩展DLL与常规DLL.由于扩展DLL支持C+接口,能够导出整个类,故在此选择MFC扩展DLL.2
4、 在DLL的类说明头文件中,使用宏AFXEXTCLASS来导出整个类.ClassAFXEXTCLASS CMyClass:pub2lic CObject3 在链接此DLL的应用程序中加入包含输出类说明的头文件.#include“e:实验 MyClass.h”1.1.2 利用关键字 declspec(dllexport)输出类1 建立MFC扩展DLL.2 在DLL的类说明头文件中加入 declspec(dllexport)关键字.classdecspec(dllexport)CMyClass:publicCObject.3 在链接此DLL的应用程序的头文件中加入相应的关键字 declspec(d
5、llimport)来导入DLL的输出类.classdeclspec(dllimport)CMyClass:public CObject 第17卷第4期2001年12月 上 海 电 力 学 院 学 报Journalof Shanghai University ofElectricPowerVol.17No.4Dec.2001 1995-2006 Tsinghua Tongfang Optical Disc Co.,Ltd.All rights reserved.1.2 输出函数1.2.1利用DLL中的模块定义文件(.def)输出函数1 使用MFC AppWizard(dll)自动创建DLL,它会
6、创建一个DEF文件的框架并添加到这个工程中,由于只需导出函数,故在此选择MFC常规DLL.2 在DEF文本文件中的EXPORTS语句后,输出函数名首先出现.下面以一个具体的DLL的DEF文件为例看一看怎样在DEF文件中加入说明语句.例如一个名为test的DLL中想要输出 函数SquareRoot:;test.defLIBRARY“test”DESCRIPTIONtest Windows Dynamic LinkLibraryEXPORTS;Explicit exports can go hereSquareRoot可以看出,我们需做的工作很简单,只要在EXPORTS语句后加上输出函数名即可,如
7、粗体部分所示.在DEF中以分号开头的语句是注释.3 在DLL的类说明头文件中,加入函数说明语句double SquareRoot(double d).4 在链接此DLL的应用程序中加入包含输出函数说明的头文件#include“e:Samples test.h”1.2.2利用关键字 declspec(dllexport)输出函数1 建立MFC常规DLL.2 在DLL的函数说明头文件中,在定义函数时加上关键字 declspec(dllexport)declspec(dllexport)double SquareRoot(dou2ble).但是如果正在使用C,则编译程序会为SquareRoot产生其
8、他语言不能使用的名字.要想使用简易名SquareRoot,建议像下面这样编写声明:extern“C”declspec(dllexport)double Square2Root(double);3 在链接此DLL的应用程序对函数进行说明的头文件中加入与上述关键字相对应的关键字declaspec(dllimport),从而引入DLL中的输出函数.Extern“C”declspec(dllimport)doubleSquareRoot(double d).1.3 导出变量1.3.1 利用DEF文件CONSTANT关键字导出变量1 建立MFC常规DLL.2 在DEF文本文件中的WXPORTS导出语句后
9、加上输出变量名,为了与输出函数相区别,在变量名后还要加上CONSTANT关键字,表明前面的导出名不是函数名,而是一个数据变量.例如一个名为number的DLL中输出数字number:;number.def:Declares the module parametersfor the DLL.LIBRARY“number”DESCRIPTIONnumber Windows Dynamic LinkLibraryEXPORTS;Explicit exports can go herenumber CONSTANT.3 在链接此DLL的应用程序中用到此输出变量前必须用extern关键字加以说明:ext
10、ern int number.特别要注意的是这种方法导出的并不是变量本身,而是DLL中导出变量的指针,应用程序必须通过强制指针转换来使用.如:int t;t=3(int3)number;pDC2 TextOut(t,t,“Hello”).其实在链接此DLL的应用程序中使用de2clspec(dllimport)关键字就方便多了,如:declspec(dllimport)int number.这里就可以直接使用,无须进行强制指针转换等许多附加工作.1.3.2 利用DEF文件DATA关键字导出变量1 建立MFC常规DLL.2在DEF文件中用DATA关键字来代替CONSTANT使用,如:;numbe
11、r,def:Declares the module parameters25上 海 电 力 学 院 学 报 2001年 1995-2006 Tsinghua Tongfang Optical Disc Co.,Ltd.All rights reserved.for the DLL.LIBRARY“number”DESCRIPTIONnumber Windows Dynamic LinkLibraryEXPORTS;Explicit exports can go herenumber DATA.3 在用户应用程序中使用 declspec(dllex2port)关键字来引入对DLL中导出变量的使用
12、,如:declspec(dllexport)int number.1.3.3 使用 declspec(dllexport)关键字导出变量1 建立MFC常规DLL.2在DLL中使用 declspec(dllexport)关键字来修饰定义要导出的变量declspec(dllexport)int number=100.3在链接此DLL的应用程序中使用 de2clspec(dllexport)关键字来引入对DLL中导出变量的使用,如:declspec(dllexport)int number.2DLL与用户应用程序链接2.1 隐式链接用户应用程序要使用隐式链接,应从DLL开发者处获取以下信息:1 包含
13、导出函数或类声明的头文件,在程序开发时要知道函数名和函数接口信息;2DLL的导入库.lib文件,应用程序在编译链接时需要;3 实际的.dll文件,它是在应用程序运行时所必需的.下面以一个具体的例子来演示如何进行隐式链接.假设已存在名为NUMBERDLL的DLL工程,工程路径为“e:Samples NUMBERDLL”及名为NUMBERAPP的应用程序工程,工程路径为“e:Samples NUMBERAPP”,我们进行下述简单操作,即可完成隐式链接.1 打开应用程序NUMBERAPP,在Project|Settings 弹出对话框中选择Link标签,在其中的“Object/Library Mod
14、ules”控件中输入指定的lib文件名,这样,在应用程序编译链接时就可以找到这个导入库文件e:Samples NUMBERDLL Debug NUMBERDLL.lib或者直接将DLL的.lib文件加入应用程序的工程中,使用Project|Add To Project|Files菜单项弹出的对话框来选择相应的LIB文件.2 使用Project|Setting 弹出的对话框,选择“Post2build step”,就是编译之后可以执行的命令.将编译生成的NUMBERDLL.dll拷贝到NUM2BERAPP.exe应用程序能找得到的目录下.这里两个工程使用的都是Win32 Debug,因此,这个命
15、令设为copy e:Samples NUMBERDLL De2bug NUMBERDLL.dlle:Samples NUMBERAPP Debug2.2 显式链接显式链接是指应用程序在运行时通过函数调用来显式装载和下载DLL,并通过函数指针来调用DLL的导出函数.使用的基本方式是:1调用LoadLibrary或AfxLoadLibrary函数装载DLL并得到模块句柄.LoadLibrary函数原形为HMODULE LoadLibrary(LPCTSTR lpLibFile2Name).AfxLoadLibrary函数原形为HINSTANCE AfxLoadLibrary(LPCTSTR lps
16、z2ModuleName).参数lpLibFileName或lpszModuleName给出.dll或.exe文件名,返回得到相应模块的句柄.2 调用GetProcAddress来获取导出函数的指针.FARPPOC GetProcAddress(HMODULE hMod2ule,/DLL模块的句柄LPCSTR lpProcName/要获取的函数的名字).3在 使 用 完 毕 后,调 用Freelibrary或AfxFreeLibrary函数来释放DLL.FreeLibrary的函数原形为35 方 莉等:关于DLL的VC+程序编程方法 1995-2006 Tsinghua Tongfang Op
17、tical Disc Co.,Ltd.All rights reserved.BOOL FreeLibrary(HMODULE hLibModule).AfxFreeLibrary的函数原形为BOOL AfxFreeLibrary(HINST ANCE hlnstLib).其中hLibModule或hlnstLib就是前面装入的模块句柄,用这个函数将DLL从一个应用程序中卸载掉.假定假设已存在导出如下函数的DLL工程,工程路径为“e:Samples MyDLL”.extern”C”declspec(dllexport)double Square2Root(double d).下面是应用程序显式
18、链接到函数的源代码:typedef double(3SQRTPROC)(double);/定义函数指针类型SQRTPROC HINSTANCE hIn2stance;/设置句柄变量hInstance=LoadLibrary(“e:实验 115 Debug 115.dll”);/获得模块句柄SQRTPROC pFunction;/设置函数指针变量PFunction=(SQRTPROC)GetProcAddress(hInstance,“SquareRoot”);/获得函数指针dubled=(3pFunction)(100);/使用输入函数FreeLibrary(hInstance);/释放模块句
19、柄.使用隐式链接,所有的DLL在用户文件加载时都被加载;但用显式链接时,可以由自己决定DLL加载或不加载.显式链接允许在运行时决定加载哪个DLL.但使用显式链接时用函数指针来调用,很容易发生错误.3 结束语编写DLL最常见的错误是没能导出正确的函数,因此,最好在代码完成前就准备好一个导出列表.如引言部分所述,只要使用得当,DLL可以提供许多方便,花点精力与时间去创建DLL是完全值得的.参考文献:1Richard C.Leinecker等著.张 艳,王文学译.Visual C+6宝典M.北京:电子工业出版社,2000.2Eugene Olafsen等著.王建华,陈一飞译.MFC Visual C
20、+6编程技术内幕M.北京:机械工业出版社,2000.3David J Kruglinski等著.希望图书创作室译.Visual C+6.0技术内幕M.北京:北京希望电子出版社,1999.Methods of VC+Programming about DLLFANG Li,LIN Zhong2da(Department of Power Engineering,Southeast University,Nangjing210096,China)Abstract:This paper introduces different methods on how to export class,funct
21、ion and variable withDLL.It gives simple ways to link DLL with consumer application program.In the paper there are corre2sponding examples according to the above2mentioned ides baseed on VC+.Key words:DLL;class;function;variable;export;link45上 海 电 力 学 院 学 报 2001年 1995-2006 Tsinghua Tongfang Optical Disc Co.,Ltd.All rights reserved.