• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
VC++动态链接库(DLL)编程深入浅出(一)
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
VC++动态链接库(DLL)编程深入浅出(一)
软件发布 VC++动态链接库(DLL)编程深入浅出(一)
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 文章首页 >> 认证考试 >> 程序员 >> VC++动态链接库(DLL)编程深入浅出(一)

VC++动态链接库(DLL)编程深入浅出(一)

添加时间: 2007-4-8 5:18:17  作者: 程序员认证参考  阅读次数:86   来源: http://www.d9soft.com

       

  先来阐述一下dll(dynamic linkable library)的概念,你可以简单的把dll看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。

  静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的exe文件中了。但是若使用dll,该dll不必被包含在最终exe文件中,exe文件执行时可以“动态”地引用和卸载这个与exe独立的dll文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。

  对动态链接库,我们还需建立如下概念:

  (1)dll 的编制与具体的编程语言及编译器无关
  只要遵循约定的dll接口规范和调用方式,用各种语言编写的dll都可以相互调用。譬如windows提供的系统dll(其中包括了windows的api),在任何开发环境中都能被调用,不在乎其是visual basic、visual c++还是delphi。

  (2)动态链接库随处可见
  我们在windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数api都包含在这些dll中。kernel32.dll中的函数主要处理内存 管理 和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。

  一般的程序员都用过类似messagebox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见dll对我们来说其实并不陌生。

  (3)vc动态链接库的分类
  visual c++支持三种dll,它们分别是non-mfc dll(非mfc动态库)、mfc regular dll(mfc规则dll)、mfc extension dll(mfc扩展dll)。

  非mfc动态库不采用mfc类库结构,其导出函数为标准的c接口,能被非mfc或mfc编写的应用程序所调用;mfc规则dll 包含一个继承自cwinapp的类,但其无消息循环;mfc扩展dll采用mfc的动态链接版本创建,它只能被用mfc类库所编写的应用程序所调用。

  由于本文篇幅较长,内容较多,势必需要先对阅读本文的有关事项进行说明,下面以问答形式给出。
  问:本文主要讲解什么内容?
  答:本文详细介绍了dll编程的方方面面,努力学完本文应可以对dll有较全面的掌握,并能编写大多数dll程序。

  问:如何看本文?
  答:本文每一个主题的讲解都附带了源代码例程,可以随文下载(每个工程都经winrar压缩)。所有这些例程都由笔者编写并在vc++6.0中调试通过。
  当然看懂本文不是读者的最终目的,读者应亲自动手实践才能真正掌握dll的奥妙。

  问:学习本文需要什么样的基础知识?
  答:如果你掌握了c,并大致掌握了c++,了解一点mfc的知识,就可以轻松地看懂本文。

2.静态链接库
  对静态链接库的讲解不是本文的重点,但是在具体讲解dll之前,通过一个静态链接库的例子可以快速地帮助我们建立“库”的概念。

图1 建立一个静态链接库

  如图1,在vc++6.0中new一个名称为libtest的static library工程(单击此处下载本工程附件),并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下:


//文件:lib.h
#ifndef lib_h
#define lib_h
extern "c" int add(int x,int y);   //声明为c编译、连接方式的外部函数
#endif

//文件:lib.cpp
#include "lib.h"
int add(int x,int y)
{
return x + y;
}

  编译这个工程就得到了一个.lib文件,这个文件就是一个函数库,它提供了add的功能。将头文件和.lib文件提交给用户后,用户就可以直接使用其中的add函数了。

  标准turbo c2.0中的c库函数(我们用来的scanf、printf、memcpy、strcpy等)就来自这种静态库。

  下面来看看怎么使用这个库,在libtest工程所在的工作区内new一个libcall工程。libcall工程仅包含一个main.cpp文件,它演示了静态链接库的调用方法,其源代码如下:


#include
#include "..lib.h"
#pragma comment( lib, "..\debug\libtest.lib" )  //指定与静态库一起连接
int main(int argc, char* argv[])
{
printf( "2 + 3 = %d", add( 2, 3 ) );
}

  静态链接库的调用就是这么简单,或许我们每天都在用,可是我们没有明白这个概念。代码中#pragma comment( lib , "..\debug\libtest.lib" )的意思是指本文件生成的.obj文件应与libtest.lib一起连接。

  如果不用#pragma comment指定,则可以直接在vc++中设置,如图2,依次选择tools、options、directories、library files菜单或选项,填入库文件路径。图2中加红圈的部分为我们添加的libtest.lib文件的路径。

图2 在vc中设置库文件路径

  这个静态链接库的例子至少让我们明白了库函数是怎么回事,它们是哪来的。我们现在有下列模糊认识了:

  (1)库不是个怪物,编写库的程序和编写一般的程序区别不大,只是库不能单独执行;
  (2)库提供一些可以给别的程序调用的东东,别的程序要调用它必须以某种方式指明它要调用之。

  以上从静态链接库分析而得到的对库的懵懂概念可以直接引申到动态链接库中,动态链接库与静态链接库在编写和调用上的不同体现在库的外部接口定义及调用方式略有差异。

3.库的调试与查看

  在具体进入各类dll的详细阐述之前,有必要对库文件的调试与查看方法进行一下介绍,因为从下一节开始我们将面对大量的例子工程。

  由于库文件不能单独执行,因而在按下f5(开始debug模式执行)或ctrl+f5(运行)执行时,其弹出如图3所示的对话框,要求用户输入可执行文件的路径来启动库函数的执行。这个时候我们输入要调用该库的exe文件的路径就可以对库进行调试了,其调试技巧与一般应用工程的调试一样。

图3 库的调试与“运行”

  通常有比上述做法更好的调试途径,那就是将库工程和应用工程(调用库的工程)放置在同一vc工作区,只对应用工程进行调试,在应用工程调用库中函数的语句处设置断点,执行后按下f11,这样就单步进入了库中的函数。第2节中的libtest和libcall工程就放在了同一工作区,其工程结构如图4所示。

图4 把库工程和调用库的工程放入同一工作区进行调试

  上述调试方法对静态链接库和动态链接库而言是一致的。所以本文提供下载的所有源代码中都包含了库工程和调用库的工程,这二者都被包含在一个工作区内,这是笔者提供这种打包下载的用意所在。

  动态链接库中的导出接口可以使用visual c++的depends工具进行查看,让我们用depends打开系统目录中的user32.dll,看到了吧?红圈内的就是几个版本的messagebox了!原来它真的在这里啊,原来它就在这里啊!

图5 用depends查看dll

  当然depends工具也可以显示dll的层次结构,若用它打开一个可执行文件则可以看出这个可执行文件调用了哪些dll。

  好,让我们正式进入动态链接库的世界,先来看看最一般的dll,即非mfc dll

 

上下文章:

 

上一篇文章: 历年高级程序员试题 三 下一篇文章: 04年下半年软件设计师(高级程序员)下午试题

相关文章:

  • 在ORACLE的存储过程中如何做简单的动态查询
  • Oracle专家高级编程学习笔记[1]
  • Oracle专家高级编程学习笔记[2]
  • oracle笔记-动态SQL(1)
  • 系统DLL技术助力木马静态变动态

相关软件:

  • 《靓妹》全动态Web报表试用版Asp.NET适配件(控件) 3.0
  • 软件编程伴侣 4.0
  • 动态壁纸王 V3.4
  • 大厅动态显示系统 V1.0
  • 易语言汉语编程环境 V4.10
  • 超想中文汇编编程学习系统(中英对照版) V3.0

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

认证考试分类导航

  • 微软认证
  • 计算机等级考试
  • 软件水平考试
  • 思科认证
  • Oracle认证
  • Linux认证
  • JAVA认证
  • 网络工程师
  • 系统工程师
  • 程序员

本类经典文章推荐

  • 软考系统分析师考试须知
  • C++箴言:绝不在构造或析构期调用...
  • 数据结构:判别是否为二叉排序树的...
  • 一个程序员的成长的六个阶段
  • 程序员英语试题常见硬件名和设备名
  • 从一个程序出发详细研究DataReader
  • 如何判断程序处于运行环境还是调试...
  • 程序高手必读:写好C程序的10条秘...
  • 程序员介绍:程序员的“素质”是什...
  • C++箴言:让=返回一个*this的引用

程序员阅读排行

  • 数据结构:判别是否为二叉排序树的...
  • VC++动态链接库(DLL)编程深入浅出...
  • VC++动态链接库(DLL)编程深入浅出...
  • 程序员考试:证书样本
  • 补码加、减运算规则及溢出判断
  • 数据结构:栈和递归求两顶点所有简...
  • DirectX8.0简介(8)
  • 水滴石穿·C语言之代码检查工...
  • 数据结构:打印线索二叉树的中序遍...
  • DirectX8.0简介(3)

认证考试阅读总排行

  • 全国计算机等级考试一级模拟试题01
  • 全国计算机等级考试一级模拟试题10
  • 全国计算机等级考试一级模拟试题08
  • MCSD简介
  • 全国计算机等级考试一级考试最新模...
  • 全国计算机等级考试一级模拟试题07
  • 全国计算机等级考试一级模拟试题02
  • 全国计算机等级考试一级模拟试题06
  • 全国计算机等级考试一级模拟试题03
  • 一级(WINDOWS)试题解析-Word篇

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有