VC DLL加载方法.doc

上传人:公**** 文档编号:562384350 上传时间:2023-08-19 格式:DOC 页数:5 大小:35.50KB
返回 下载 相关 举报
VC DLL加载方法.doc_第1页
第1页 / 共5页
VC DLL加载方法.doc_第2页
第2页 / 共5页
VC DLL加载方法.doc_第3页
第3页 / 共5页
VC DLL加载方法.doc_第4页
第4页 / 共5页
VC DLL加载方法.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《VC DLL加载方法.doc》由会员分享,可在线阅读,更多相关《VC DLL加载方法.doc(5页珍藏版)》请在金锄头文库上搜索。

1、调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同。Windows提供了两种将DLL映像到进程地址空间的方法:1. 隐式的加载时链接这种方法需要DLL工程经编译产生的LIB文件,此文件中包含了DLL允许应用程序调用的所有函数的列表,当链接器发现应用程序调用了LIB文件列出的某个函数,就会在应用程序的可执行文件的文件映像中加入一些信息,这些信息指出了包含这个函数的DLL文件的名字。当这个应用程序运行时,也就是它的可执行文件被操作系统产生映像文件时,系统会查看这个映像文件中关于DLL的信息,然后将这个DLL文件映像到进程的地址

2、空间。系统通过DLL文件的名称,试图加载这个文件到进程地址空间时,它寻找DLL 文件的路径按照先后顺序如下:程序运行时的目录,即可执行文件所在的目录;当前程序工作目录系统目录:对于Windows95/98来说,可以调用GetSystemDirectory函数来得到,对于WindowsNT/2000 来说,指的是32位Windows的系统目录,也可以调用GetSystemDirectory函数来得到,得到的值为SYSTEM32。Windows目录列在PATH环境变量中的所有目录VC中加载DLL的LIB文件的方法有以下三种:LIB文件直接加入到工程文件列表中在VC中打开File View一页,选中

3、工程名,单击鼠标右键,然后选中“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;在Relea

4、se方式下,产生的LIB文件是Release版本,如Regr.lib。当应用程序对DLL的LIB文件加载后,还需要把DLL对应的头文件(*.h)包含到其中,在这个头文件中给出了DLL中定义的函数原型,然后声明。2 显式的运行时链接隐式链接虽然实现较简单,但除了必须的*.dll文件外还需要DLL的*.h文件和*.lib文件,在那些只提供*.dll文件的场合就无法使用,而只能采用显式链接的方式。这种方式通过调用API函数来完成对DLL的加载与卸载,其能更加有效地使用内存,在编写大型应用程序时往往采用此方式。这种方法编程具体实现步骤如下:使用Windows API函数Load Library或者MF

5、C提供的AfxLoadLibrary将DLL模块映像到进程的内存空间,对DLL模块进行动态加载。使用GetProcAddress函数得到要调用DLL中的函数的指针。不用DLL时,用Free Library函数或者AfxFreeLibrary函数从进程的地址空间显式卸载DLL。例:在应用程序中调用dll文件 在应用程序中要首先装入dll后才能调用导出表中的函数,例如用mfc 创建基于对话框的工程test,并在对话框上放置load按钮,先添加装载代码。1.首先在testdlg.cpp的首部添加变量设置代码: /设置全局变量glibsample用于存储dll句柄 hinstance glibsamp

6、le=null; /第二个变量showme是指向dll库中showme()函数的指针typedef int(* showme)(void);showme showme;2.利用classwizard为load按钮添加装载dll的代码 void ctestdlg:onloadbutton() /要添加的代码如下 if(glibmydll!=null) messagebox(the sample.dll has already been load.); return; /装载sample.dll,未加路径,将在三个默认路径中寻找 (1)windows的系统目录:windowssystem; /(2

7、)dos中path所指出的任何目录; /(3)程序所在的目录; glibsample=loadlibrary(sample.dll); /返回dll中showme()函数的地址 showme=(showme)GetProcAddress(glibsample,showme);/*应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual C+6.0在VCbin目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1包含EXE文件

8、的目录,2进程的当前工作目录, 3Windows系统目录, 4Windows目录,5列在Path环境变量中的一系列目录。1隐式链接隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。下面的例子通过隐式链接调用MyDll.dll库中的Min函数。首先生成一个项目为TestDll,在DllTest.h、DllTest.cpp文件中分别输入如下代码:/Dlltest.h#pragma comment(lib,MyDll.lib)extern C_declspec(dl

9、limport) int Max(int a,int b);extern C_declspec(dllimport) int Min(int a,int b);/TestDll.cpp#include#includeDlltest.hvoid main()int a;a=min(8,10)printf(比较的结果为%dn,a);在创建DllTest.exe文件之前,要先将MyDll.dll和MyDll.lib拷贝到当前工程所在的目录下面,也可以拷贝到windows的System目录下。如果DLL使用的是def文件,要删除TestDll.h文件中关键字extern C。TestDll.h文件中的

10、关键字Progam commit是要Visual C+的编译器在link时,链接到MyDll.lib文件,当然,开发人员也可以不使用#pragma comment(lib,MyDll.lib)语句,而直接在工程的Setting-Link页的Object/Moduls栏填入MyDll.lib既可。2显式链接显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库

11、调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下面是通过显式链接调用DLL中的Max函数的例子。#include #includevoid main(void)typedef int(*pMax)(int a,int b);typedef int(*pMin)(int a,int b);HINSTANCE hDLL;PMax MaxHDLL=LoadLibr

12、ary(MyDll.dll);/加载动态链接库MyDll.dll文件;Max=(pMax)GetProcAddress(hDLL,Max);A=Max(5,8);Printf(比较的结果为%dn,a);FreeLibrary(hDLL);/卸载MyDll.dll文件; 在上例中使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针,然后通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄,然后通过GetProcAddress()函数获取导入到应用程序中的函数指针,函数调用完毕后,使用FreeLibrary()卸载DLL文件。在编译程序之前,首先要

13、将DLL文件拷贝到工程所在的目录或Windows系统目录下。使用显式链接应用程序编译时不需要使用相应的Lib文件。另外,使用GetProcAddress()函数时,可以利用MAKEINTRESOURCE()函数直接使用DLL中函数出现的顺序号,如将GetProcAddress(hDLL,Min)改为GetProcAddress(hDLL, MAKEINTRESOURCE(2)(函数Min()在DLL中的顺序号是2),这样调用DLL中的函数速度很快,但是要记住函数的使用序号,否则会发生错误。编程时用ad.h,ad.lib,放在项目当前目录里在头文件中加入#include ad.h在Project Setting-Link-Object/library modules加入ad.lib执行时将ad.dll跟你的程序放在同一目录

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号