




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC下DLL/lib的调用 分类: C/C+ 2011-11-11 19:08 289人阅读 评论(0) 收藏 举报 1、简介:dll和.lib都是程序集合,便于代码重用。都是二进制的文件。.dll也叫动态链接库,与程序链接的方式为运行时链接(run-timelinked),为PE(portableexecutable)格式,也就是程完整的程序。.exe、.dll、.fon、.mod、.drv、.ocx等等都是动态链接库。如.exe为系统调用的函数集合。.dll不存在同名引用,且有导出表,与导入表。.lib也叫静态链接库,在编译时与程序链接(link-timelinked),将“嵌入”到程序中。会有冗余(程序文件代码的冗余和运行时内存存储的冗余),当两个lib相链接时地址会重新建立同。在使用.lib之前,要在程序源代码中引用lib对应的头文件.h,这些头文件告诉编译器.lib中有什么。在生成.dll时,通常会生成一个.lib。这个.lib将被编译到程序文件中,在程序运行的时候,告诉操作系统将要加载的.dll。这个.lib包括对应.dll的文件名、顺序表(ordinaltable包含.dll暴露出的函数的进入点),在程序运行的时候,通过顺序表实现函数的跳转。如果不想使用或者找不到该.lib,可以用LoadLibrary()Win32API和GetLibrary()Win32API。VCIDE为了实现程序调试,会生成.PDB(程序数据库,二进制),里面包含源文件调用的文件信息和行信息。这样就可以逐行调试了。打开.lib,查看其ascii码,可以看到如My_Function1123的函数名,这些名称在编译时被编译器运用manglingmechanism进行了名称的mangling。在程序的编译过程中,如果出现如下错误“unresolvedsymbol_some_funtion1234”,通常是因为找不到引用过的外部函数对应的.lib文件,或者是.c、.cpp源文件。2、使用:用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同。Windows提供了两种将DLL映像到进程地址空间的方法: 1、隐式的加载时链接这种方法需要DLL工程经编译产生的LIB文件,此文件中包含了DLL允许应用程序调用的所有函数的列表,当链接器发现应用程序调用了LIB文件列出的某个函数,就会在应用程序的可执行文件的文件映像中加入一些信息,这些信息指出了包含这个函数的DLL文件的名字。当这个应用程序运行时,也就是它的可执行文件被操作系统产生映像文件时,系统会查看这个映像文件中关于DLL的信息,然后将这个DLL文件映像到进程的地址空间。系统通过DLL文件的名称,试图加载这个文件到进程地址空间时,它寻找DLL 文件的路径按照先后顺序如下:程序运行时的目录,即可执行文件所在的目录;当前程序工作目录系统目录:对于Windows95/98来说,可以调用GetSystemDirectory函数来得到,对于WindowsNT/2000来说,指的是32位Windows的系统目录,也可以调用GetSystemDirectory函数来得到,得到的值为SYSTEM32。Windows目录列在PATH环境变量中的所有目录VC中加载DLL的LIB文件的方法有以下三种:LIB文件直接加入到工程文件列表中在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中Add Files to Project菜单,在弹出的文件对话框中选中要加入DLL的LIB文件即可。设置工程的 Project Settings来加载DLL的LIB文件打开工程的 Project Settings菜单,选中Link,然后在Object/library modules下的文本框中输入DLL的LIB文件。通过程序代码的方式 加入预编译指令#pragma comment (lib,*.lib),这种方法优点是可以利用条件预编译指令链接不同版本的LIB文件。因为,在Debug方式下,产生的LIB文件是Debug 版本,如Regd.lib;在Release方式下,产生的LIB文件是Release版本,如Regr.lib。当应用程序对DLL的LIB文件加载后,还需要把DLL对应的头文件(*.h)包含到其中,在这个头文件中给出了DLL中定义的函数原型,然后声明。2、显式的运行时链接隐式链接虽然实现较简单,但除了必须的*.dll文件外还需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的场合就无法使用,而只能采用显式链接的方式。这种方式通过调用API函数来完成对DLL的加载与卸载,其能更加有效地使用内存,在编写大型应用程序时往往采用此方式。这种方法编程具体实现步骤如下:使用Windows API函数Load Library或者MFC提供的AfxLoadLibrary将DLL模块映像到进程的内存空间,对DLL模块进行动态加载。使用GetProcAddress函数得到要调用DLL中的函数的指针。不用DLL时,用Free Library函数或者AfxFreeLibrary函数从进程的地址空间显式卸载DLL。调用DLL有两种方法:静态调用和动态调用.(一).静态调用其步骤如下:1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下;2.把你的youApp.lib拷到你目标工程(需调用youApp.DLL的工程)目录下;3.把你的youApp.h(包含输出函数的定义)拷到你目标工程(需调用youApp.DLL的工程)目录下;4.打开你的目标工程选中工程,选择Visual C+的Project主菜单的Settings菜单;5.执行第4步后,VC将会弹出一个对话框,在对话框的多页显示控件中选择Link页。然后在Object/library modules输入框中输入:youApp.lib6.选择你的目标工程Head Files加入:youApp.h文件;7.最后在你目标工程(*.cpp,需要调用DLL中的函数)中包含你的:#include youApp.h注:youApp是你DLL的工程名。(二).动态调用其程序如下:动态调用时只需做静态调用步骤1.0102 HINSTANCE hDllInst = LoadLibrary(youApp.DLL);03 if(hDllInst)04 05 typedef DWORD (WINAPI*MYFUNC)(DWORD,DWORD);06 MYFUNCyouFuntionNameAlias=NULL;07 / youFuntionNameAlias 函数别名08 youFuntionNameAlias= (MYFUNC)GetProcAddress(hDllInst,youFuntionName);09 / youFuntionName 在DLL中声明的函数名10 if(youFuntionNameAlias)11 12 youFuntionNameAlias(param1,param2);13 14 FreeLibrary(hDllInst);15 16 显式(静态)调用:LIB + DLL + .H,注意.H中dllexport改为dllimport隐式(动态)调用:DLL + 函数原型声明,先LoadLibrary,再GetProcAddress(即找到DLL中函数的地址),不用后FreeLibrary-动态链接库DLL的链接/mmycly/archive/2006/06/15/917076.aspx应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual C+6.0在VCbin目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1包含EXE文件的目录,2进程的当前工作目录, 3Windows系统目录, 4Windows目录,5列在Path环境变量中的一系列目录。(一).隐式链接隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。下面的例子通过隐式链接调用MyDll.dll库中的Min函数。首先生成一个项目为TestDll,在 DllTest.h、DllTest.cpp文件中分别输入如下代码:01 /Dlltest.h02 #pragma comment(lib,MyDll.lib)03 extern C_declspec(dllimport)intMax(inta,int b);04 extern C_declspec(dllimport)intMin(inta,int b);05 /TestDll.cpp06 #include07 #includeDlltest.h08 voidmain()09 10 int a;11 a=min(8,10)12 printf(比较的结果为%dn,a);13 在创建DllTest.exe文件之前,要先将MyDll.dll和MyDll.lib拷贝到当前工程所在的目录下面,也可以拷贝到windows的 System目录下。如果DLL使用的是def文件,要删除TestDll.h文件中关键字extern C。TestDll.h文件中的关键字Progam commit是要Visual C+的编译器在link时,链接到MyDll.lib文件,当然,开发人员也可以不使用#pragma comment(lib,MyDll.lib)语句,而直接在工程的Setting-Link页的Object/Moduls栏填入 MyDll.lib既可。编程时用ad.h,ad.lib,放在项目当前目录里在头文件中加入#include ad.h在Project SettingLinkObject/library modules加入ad.lib执行时将ad.dll跟你的程序放在同一目录(二).显式链接显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下面是通过显式链接调用DLL中的Max函数的例子。01 #include02 #include03 voidmain(void)04 05 typedef int(*pMax)(inta,int b);06 typedef int(*pMin)(inta,int b);07 HINSTANCE hDLL;08 PMax Max09 HDLL=LoadLibrary(MyDll.dll);/加载动态链接库MyDll.dll文件;10 Max=(pMax)GetProcAddress(hDLL,Max);11 A=Max(5,8);12 Printf(比较的结果为%dn,a);13 FreeLibrary(hDLL);/卸载MyDll.dll文件;14 在上例中使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针,然后通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄,然后通过GetProcAddress()函数获取导入到应用程序中的函数指针,函数调用完毕后,使用 FreeLibrary()卸载DLL文件。在编译程序之前,首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。使用显式链接应用程序编译时不需要使用相应的Lib文件。另外,使用GetProcAddress()函数时,可以利用 MAKEINTRESOURCE()函数直接使用DLL中函数出现的顺序号,如将GetProcAddress(hDLL,Min)改为 GetProcAddress(hDLL, MAKEINTRESOURCE(2)(函数Min()在DLL中的顺序号是2),这样调用DLL中的函数速度很快,但是要记住函数的使用序号,否则会发生错误。MFCdll生成和使用VC中生成DLL的办法见:/KB/DLL/RegDLL.aspx-VC中使用DLL/c1230v/articles/1401448.html课题来源: 为了实现将串口传上来的数据作图,在网上下载了一个CLPLOT的封装类。问题:该分装类就像是一个控件,可以灵活调用。但是,存在一个问题,就是不知道如何快捷的生成exp,lib,dll文件。解决方法: 打开工程,第一步,我们需要生成lib,exp文件。打开project-settings,出现如图(1)对话框。在l
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年教师招聘之《幼儿教师招聘》考前冲刺模拟题库含答案详解(预热题)
- 教师招聘之《小学教师招聘》通关训练试卷详解(培优b卷)附答案详解
- 2025内蒙古呼伦贝尔林业集团有限公司招聘工作人员5人考试备考及答案详解(全优)
- 2025年教师招聘之《幼儿教师招聘》通关试题库附答案详解【综合题】
- 2025年教师招聘之《幼儿教师招聘》题库高频重点提升(共100题)附参考答案详解(轻巧夺冠)
- 教师招聘之《小学教师招聘》能力提升题库(必刷)附答案详解
- 2025年教师招聘之《小学教师招聘》题库试题及参考答案详解
- 教师招聘之《幼儿教师招聘》考前冲刺练习题库提供答案解析及参考答案详解【能力提升】
- 2025年教师招聘之《幼儿教师招聘》能力检测试卷含答案详解(黄金题型)
- 2025年教师招聘之《幼儿教师招聘》通关练习试题有答案详解
- 中学校长在2025年秋季学期开学典礼上致辞:在时光里耕耘在成长中绽放
- 2025年新形势下新型储能发展趋势分析报告
- 2025年医疗器械注册与备案管理办法试题(附答案)
- 小学道德与法治五年级上册《烟酒有危害》教学课件
- 2025年登革热防控试题(附答案)
- 2025-2026学年人教版小学数学四年级上册教学计划及进度表
- 2025年承包学校食堂餐饮废弃物处理合同
- 2024年安徽大学招聘真题(行政管理岗)
- 部编版道德与法治小学四年级上册期末复习专练试题及答案(全套)
- 2025年发展对象培训班考试题库并带答案
- GB/T 10257-2025核仪器和核辐射探测器质量检验规则
评论
0/150
提交评论