Windows下动态链接库的创建和使用

来源 :电脑学习 | 被引量 : 0次 | 上传用户:aa87850011
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘 要:介绍了Windows下动态链接库的创建和使用方法。
  关键词:动态链接库 导出函数 隐式链接 显式链接
  中图分类号 TF311.52 文献标识码 B 文章编号:1002-2422(2007)03--0048-02
  
  1 动态链接库的创建
  
  在VC 6.0开发系统的菜单“File”中单击“New”,在弹出窗口中选择Project选项卡,可以看到有Win32 Dy-name-Link Library和MFC AppWizard两种方式创建动态链接库。前者用来创建不与MFC(微软基础类库)链接的动态链接库,称为非MFC动态库,后者创建与MFC链接的动态链接库,称为MFC动态库。
  
  1.1 创建非MFC动态库
  选择Win32 Dynamic-Link Library,在Project name编辑框输入工程名:MyDLL,创建一个空的非MFC工程。
  要使DLL中包含的某些函数和数据能够被外部应用程序调用,就应该在创建DLL时,指出这些函数(数据)是可导出的,称为导出函数(数据)。导出函数有两种方法,一种是在声明函数原型语句中的函数类型关键字左边添加导出关键字_declspec(dlhxport);另一种是使用模块定义文件.def。
   (1)使用导出关键字declapee(duexport)导出函数
  在前面创建的空工程中加入MyDLL.h、MyDL、cpp两个文件,
  头文件MyDLL.h.代码如下:_declspec(dllexport)int Add(int x,int y);
  实现文件MyDLL.cpp代码如下:#include
  #include“MyDLL.h”
  int Add(int x,int y)
  { return(x+y);}
  在工程中有一个被导出函数(输出函数)Add(),用来进行加法运算。
  编译、连接工程MyDLL,成功后,可以看到debug目录下生成了动态库MyDLL.d11和引入库MyDLL.Iib这两个文件。引入库文件中存有对应DLL的文件名和输出函数名等(MyDLL、Add等),动态库文件中存有实际的函数和数据。
  (2)使用模块定义文件.def导出函数
  对方法(1)中建立的工程,删除文件MyDLL.h,保留文件MyDLL.cpp,再加入文本文件MyDLL.def作为模块定义文件。在MyDLL.def中输入代码如下:
  ;MyDLL.def
  LIBRARY MyDLL
  EXPORTS
  Add
  一个模块定义文件至少要有两条语句,一条是LI-BRARY语句,用它指出DLL的名字,该语句必须位于除注释语句外的其它语句之前;另一条是EXPORTS语句,在它之下列出输出函数的名字。
  
  1.2 创建MFC动态库
  选择MFC AppWizard,在Project name编辑框输入工程名:MyDLL,单击OK,可创建三种类型的MFC动态库:第一种是与MFC静态链接的常规DLL(Regular DLLWith MFG Statically Linked);第二种是与MFC动态链接的常规DLL(Regular DLL using shared MFC DLL)。常规DLL既可以被MFC应用程序使用,也可以被非MFC应用程序使用(BC,VB等)。第三种是MFC扩展型DLL(MFCExtension DLL),这种DLL与MFC动态链接,其特点是可导出MFC派生类,但MFC扩展型DLL只能被那些动态链接到MFC的应用程序使用。
  MFC动态库导出函数(或变量)的方法与非MFC动态库的导出方法相同。
  MFC扩展DLL导出类的常用方法是在类的声明前加一个宏“AFX_EXT_CLASS”,例如:class AFX_EXT_CLASSCMyClass;
  特别要注意的是,对于动态链接到MFC的DLL,其输出函数若要调用MFC,则在该输出函数的定义体内第一条语句必须是下面的宏语句:
  AEX_MANAGE_STATE(AfxCetStaticModuleStme());
  此语句保证在其后输出函数中的语句能够调用MFC。
  新创建的动态链接库提供给其它程序使用时(或发布)要提供三个文件:动态库文件(MyDLLdll)、引入库文件(MyDLL.lib)和头文件(MyDLL.h)。发布与MFC动态链接的动态库时还要附上VC 开发系统内的MFC#O.dll(文件名中#是MFC的版本号码)和MSVCRT.dll这两个动态库。
  
  2 动态链接库的使用
  
  应用程序使用动态库时可以采用两种链接方式:隐式链接和显式链接。
  
  2.1 隐式链接
  应用程序使用引入库(.lib)文件隐式链接到DLL,DLL中的函数和数据并不复制到可执行文件中,在可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址。隐式链接方式下,操作系统加载应用程序时就加载DLL文件。
  实现隐式链接需要创建动态库时产生的三个文件:动态库文件(.dll)、引入库文件(.lib)和头文件(.h)。隐式链接的三个要点如下:
  (1)把动态库的头文件(.h)拷贝到应用程序工程目录下,对其拷贝作如下修改:把所有的导出关键字declspec(dllexport)换成导入关键字_declspec(dllimport),在文件开始处加入语句:#pragma comment(lib,“引入库名”),告诉Link要连接引入库,在应用程序的各个使用DDL的.cpp文件中用语句#include包含这个头文件(.h)。
  (2)将引入库(.lib)拷贝到应用程序工程目录下,以便VC 的Link链接时使用。
  (3)将动态库(.dll)复制到应用程序工程目录下,便于Windows查找。
  下面是一个制台应用程序DLLTestA隐式链接到前面创建的动态库的例子。
  头文件DLLTestA.h代码如下:
  #pragma comment(lib,“MyDLL.lib”)
  _declspec(dllimport)int Add(int x,int y);
  实现文件DLLTestA.cpp代码如下:
  #1nchde
  #include“DLLTestA.h”
  void main()
  {int a;
  a=Add(20,10);
  printf(“20 10=%d”,a);
  }
  DLLTextA.h文件中的关键字pmgam comment通知Link程序要链接MyDLL.lib。导入关键字_declspec(dl-Hmpoa)用来说明其后的函数是从动态库中引入的。按Ctrl F5键就可以编译执行该程序。
  
  2.2 显式链接
  使用显式链接时,应用程序不需要使用相应的.lib和.h文件,只需将.dll拷贝到当前工作目录下即可。显式链接方式下,应用程序运行时可以随时加载和卸载DLL。
  显式链接的几个要点如下:
  (1)调用GetModuleHandle()函数检查DLL是否已经被映射到进程的地址空间中:
  (2)调用LoadLibrary函数加载DLL并得到其模块句柄:
  (3)调用GetProcAddress函数获得DLL中输出函数的地址:
  (4)使用DLL结束后,调用FreeLibrary函数卸载DLL。
  下面是在MFC对话框工程DLLTestB中实现显式链接的部分代码:
  void CDLLTestBDlg::OnAdd()
  {
  HMODULE hlnst=GetModuleHandle(“MyDLL.dll”);
  if(hlnst==NULL)
  {hlnst=LoadLibrary(“MyDLL.dll”);}
  typcda int(*AddProe)(int m,int n);
  AddProc addp=(AddProc)GetProcAddress(hlnst“Add”);
  if(!addp){“MessageBox(“获取函数地址失败!”);return;”}
  CString str;
  str.Format(“10 20=%d”,addp(10,20));
  MessageBox(str);
  FreeLibrary(hlnst);
  }
  上面代码中使用类型定义关键字typedef定义与DLL中相同类型的函数指针,用来存函数的地址。
  
  3 结束语
  
  DLL封装了共享资源和代码,在开发以Windows为平台的应用程序时,使用DLL技术开发项目,可简化项目管理,提高开发速度。因此,掌握DLL技术很有必要。
其他文献
情感,是人们对客观事物在心理与态度上产生的反应。培养学生良好的情感,能促进学生良好人格特征的形成。而语文教学正是传递情感的重要媒介。《小学语文新课标》就曾指出,不应把情感、态度和价值观当作外在的附加任务,应该注重熏陶感染,潜移默化,把这些内容贯穿于日常教学之中。那么,我们该怎样做才能达到情感教学的目标,做到——随“情”潜入“心”, 让春风化雨的情感教学润得“满园万物生”呢?  一、课前——“备足”
摘 要:学习汉语普通话的外国人越来越多,对外汉语教师的师资力量的匮乏,严重制约了对外汉语教学的发展。针对希望进一步掌握普通话口语学习的外国学习者,该研究提出了一种普通话游戏学习系统。本系统的学习模式结合了计算机技术和语言学研究成果,打破了传统的教学模式的限制,对学习者进行实时评测,提供学习报告与口语学习的最终评定结果。结果表明,该系统能够较为有效地辅助外国学习者的普通话口语学习。  关键词:普通话
【摘要】班主任管理班级的工作是协调各方面教育影响的工作,而不是单纯的班主任管理学生的工作。但目前,笔者所在的山区学校缺乏协调各方资源,究其原因主要是不善于运用合作机制的问题。针对这种情况,本文就班主任运用合作机制,创建和谐班级的方法进行探讨。  【关键词】班主任;合作机制;和谐班级  合作是当今时代的主题。教育事业也不例外,成功的班级管理和教育需要全面而科学的合作。传统的班级建设中,班主任角色的定
“浪漫夫妻”周雅雪、李顺:  在密林深处打造温馨小窝  “浪漫夫妻”周雅雪、李顺:  在密林深处打造温馨小窝  1985年出生于重庆的周雅雪,曾经是一个典型的女强人。26岁时,她厌倦了城市生活,卖掉公司和车子四处旅行,从青藏高原到太湖之滨,从香格里拉到南亚诸国……旅行过程中,周雅雪认识了小她五岁的李顺,两人一见钟情。  2016年春节前夕,周雅雪和李顺再次登上了他们初次见面的重庆平顶山。平顶山公园
【摘要】高中阶段化学是一门重要的科目,学习好化学知识不是一朝一夕的事情。教师需要运用科学的教学方法,通过问题情境创设来传授化学知识。本文以高中化学新课程教学中问题情境创设策略研究为题,分析问题情境创设的概况及意义、论述高中化学新课程教学的现状,并提出几点相关的策略,以激发学生的学习兴趣,加深学生对化学知识的理解,改善高中化学的课堂教学效果。  【关键词】高中化学;新课程教学;问题情境  教育领域逐
本期专题继续围绕STC课程在中国进行课程实践展开。我们采访了课题的合作方美国史密森尼科学教育中心主任, 并邀请参与课题研究的科学教育工作者从合作学习、学生笔记、课程的材料支持系统、阅读材料4个方面介绍了他们实践研究的发现和分析。其实,当走入我国一个教育发展较好地区的科学课堂,可以看到我们的教学也已经有了合作学习策略,以及为学生提供笔记记录指导等可喜的教学改革,但是课题组通过他们对STC课程的实践研
摘要:“凡事预则立,不预则废。”备课是上好一节课的前提,但是学生是教学的主体,他们的课堂行为具有不确定性,课堂不可避免地会有意外生成,偏离原先预设的轨道,生成性课堂的有效构建要体现在教案外的教师的智慧,才会让课堂流光溢彩。  关键词:探究;生成;建构;创造  文章编号:1008-0546(2014)07-0038-02 中图分类号:G633.8 文献标识码:B  doi:10.3969/j.iss
车老师:  因为孩子和婆婆,现在的我感到心烦意乱,不知所措。  我研究生毕业后被分到省直机关工作。前年,我开始一边工作一边攻读博士学位,为更好的未来奋斗着。去年,我和老公结婚并怀孕后,考虑到我的工作和学习很忙,我们打算长期请保姆带孩子,但需要请婆婆在一旁看着保姆(我妈妈身体很不好,常年在乡下休养)。婆婆刚开始还同意,等我休完产假上班了,婆婆又说这个保姆不错,不用她盯着也行。但是,我非常不放心。老公
早睡早起,每天喝8大杯水、洗冷水澡……这些口耳相传的“健康圣经”真的可以永葆健康?专家表示,这些流传己久的养生观念有些确实可延年益寿,有些则是以讹传讹,不可轻信。    早睡早起身体好?    许多人认为:早睡早起有益身体健康,可延年益寿。为遵循这套人人皆知的养生哲学,不少人在晚上10点以前一定上床睡觉,早上四五点钟起床,可这对现代人来说很难做到。早睡早起真的会身体比较健康吗?  迷雾公开:“早睡
1 探因析例法  探因析例法,就是探究某事例的深层次原因,以求发现事物的核心、本质,揭示其因果逻辑关系,使内容深刻。例如:  有时人们也会生发这样的慨叹,为什么英雄只在远方?我的生活中何日英雄突现?心情可以理解,但认识不能说没有偏差。很多人认为,只有做出惊天动地大事的人才是英雄,只有媒体铺天盖地宣传的人才是英雄。用狭隘与拔高的标准衡量,真正称得上英雄的屈指可数。实际上,“最美女教师”“最美司机”都