Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)

调用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文件

——在应用程序中要首先装入dll后才能调用导出表中的函数,例如用mfc

创建基于对话框的工程test,并在对话框上放置"load"按钮,先添加装载代码。

1.首先在testdlg.cpp的首部添加变量设置代码:

//设置全局变量glibsample用于存储dll句柄

HINSTANCE  glibsample=null;   //如果定义成HANDLE类型,则出错

//第二个变量showme是指向dll
库中showme()函数的指针

typedef int(* Showme)(void);

Showme showme;

2.利用classwizard为"load"按钮添加装载dll的代码

void ctestdlg::onloadbutton()

{

//要添加的代码如下

if(glibsample!=NULL)

{

AfxMessageBox("the sample.dll has already been load.");

return;

}

//装载sample.dll,未加路径,将在三个默认路径中寻找 (1)windows的系统目录:/windows/system;

//(2)dos中path所指出的任何目录;

//(3)程序所在的目录;

glibsample=Loadlibrary("sample.dll");

//返回dll中showme()函数的地址

showme=(Showme)GetProcAddress(glibsample,"showme");

http://blog.csdn.net/jiangxinyu/article/details/4736577

时间: 2024-10-13 10:46:47

Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)的相关文章

Windows提供了两种将DLL映像到进程地址空间的方法

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

两种在linux下创建应用程序快捷方式的方法

两种在linux下创建应用程序快捷方式的方法: A. 在桌面上创建快捷方式 B. 在应用程序菜单中添加快捷方式 在桌面上创建快捷方式 这是最简单的一种方法,在桌面上单击鼠标右键,会有一个“创建启动器”栏.这里我以为mplayer创建快捷方式为例说明: 名称-mplayer(或者你喜欢的任何名称,这个名称会出现在快捷图标的 下方) 命令-/usr/bin/gmplayer(这个是mplayer的gui应用程序的执行文件,跟 安装路径相关,可以通过which gmplayer找到) 图标-一般应用程

两种设置win7宽带开机自动拨号连接的方法

新开通的vps,每次vps重启宽带连接都不会自动连上,很多客户都想做到开机自动连接宽带,每次开机都要手动拨号是很麻烦的.其实我们只要将宽带设置为开机自动连接就省心了.下面就教大家两种Win7系统设置开机自动拨号连接的方法. 一.使用windows系统的“启动”文件夹自动开机连接宽带 1.右键桌面右下角的“网络连接”,打开“网络和共享中心” 2.点击“更改适配器设置”,找到“宽带连接”选项 3.打开“宽带连接”属性,在“选项”中将“提示名称.密码和证书等”前面的勾去掉,点击确定, 4.右击“宽带连

手把手教你如何安装Tensorflow(Windows和Linux两种版本)

现在越来越多的人工智能和机器学习以及深度学习,强化学习出现了,然后自己也对这个产生了点兴趣,特别的进行了一点点学习,就通过这篇文章来简单介绍一下,关于如何搭建Tensorflow以及如何进行使用.建议的话,还是要学习了一点Python基础知识和Linux知识是最好的! 版本:Windows7 一:安装Anaconda和Tensorflow 步骤: 1:从官方网站下载Anaconda https://www.anaconda.com/download/ 2:进行软件安装(这个和普通的没什么特别区别

网络层提供的两种服务

网络层关注的是如何将分组从源端沿着网络路径送达目的端. 在计算机网络领域,网络层应该向运输层提供怎样的服务("面向连接"还是"无连接")曾引起了长期的争论. 争论焦点的实质就是:在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统? 两种服务:网络层应该向运输层提供怎样的服务? §虚电路服务 §数据报服务 因特网:数据报服务 网络层向上只提供简单灵活的.无连接的.尽最大努力交付的数据报服务. 网络在发送分组时不需要先建立连接.每一个分组(即 IP数据报)独立发送

使用linux访问windows共享文件的两种方法

上次做了一个linux的samba文件共享,使windows可以访问linux共享出来的文件目录,今天做一个在windows中共享文件或者使用软件使linux主机可以访问windows共享出来的文件及目录.实际操作才是重点. 实验目的:使用linux访问windows共享文件. 实验步骤:主要分为两种方式,第一种是使用xshell.xftp软件直接拖拽,然后在linux系统中找到文件就可以使用了. 第二种是在windows中共享文件目录,然后在linux中使用命令进行访问,最后挂载并使用. 首先

vmware虚拟机挂载Windows磁盘的两种方法

第一种 vmware虚拟机通过ntfs-3g挂接windows盘 1.共享windows盘虚拟机设置-->添加硬盘-->选择IDE-->使用物理磁盘-->选择本地盘(单分区)-->默认完成添加 2.上传ntfs-3g-2017.3.23-6.el7.x86_64.rpm安装:rpm -ivh ntfs-3g-2017.3.23-6.el7.x86_64.rpm 3.挂载:查看本地磁盘列表:fdisk -l挂载:mount -t ntfs-3g /dev/sdb1 /data1

文件复制:C语言方法、Windows API的两种方法

#include <stdio.h> #include <errno.h> #define BUF_SIZE 256 int main(int argc, char *argv[]) { FILE *inFile, *outFile; char rec[BUF_SIZE]; size_t bytesIn, bytesOut; if(argc != 3) { printf("Usage:cpc file1 file2\n"); return 1; } inFile

【MFC】picture控件 两种有细微差别的动态加载图片方法

摘自:http://www.jizhuomi.com/software/193.html VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control) 分类标签: 编程入门  VS2010  VC++  MFC 上一节中鸡啄米讲的是滚动条控件,本节主要讲一种简单实用的控件,图片控件Picture Control.我们可以在界面某个位置放入图片控件,显示图片以美化界面. 图片控件简介 图片控件和前面讲到的静态文本框都是静态文本控件,因此两者的使用方法有很多相同之处,所属