动态链接库dll,vs查看dll源码

  作者:宋宝华

  资料来源:Tianji.com。

  原文:http://soft.yesky.com/lesson/318/2166818.shtml? 412

  动态链接库是Windows系统的核心,也是COM技术的基础。因此,突破DLL一直是技术人员至关重要的目标。本期将由浅入深介绍DLL的基本概念、分类、实现和应用。

  基本概念

  1 .简介

  我们先来解释一下DLL(动态链接库)的概念。你可以简单的把DLL看成一种仓库,它给你提供了一些可以直接使用的变量、函数或者类。在仓库发展史上,经历了“无库-静态链接库-动态链接库”的时代。静态链接库和动态链接库都共享代码。如果采用静态链接库,那么不管你喜不喜欢,lib中的指令都会直接包含在最终的EXE文件中。但是,如果使用DLL,它不需要包含在最终的EXE文件中。EXE文件执行时,可以“动态”引用并卸载这个独立于EXE的DLL文件。静态链接库和动态链接库的另一个区别是,静态链接库不能再包含其他动态链接库或静态库,而动态链接库还可以包含其他动态或静态链接库。

  对于dll,我们还需要建立以下概念:

  (1)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,分别是非MFC DLL(非MFC动态库)、MFC常规DLL(MFC常规DLL)和MFC扩展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之前,一个静态链接库的例子可以帮助我们快速建立“库”的概念。

  [/img]http://dev . yesky . com/imagelist/05/10/6v 58 bw 881n 81 . jpg[/img]

  图1建立了一个静态链接库。

  如图1所示,在VC 6.0中,创建一个名为libTest的静态库项目(点击此处下载此项目),新建两个文件lib.h和lib.cpp,lib.h和lib.cpp的源代码如下:

  引用:

  //File: lib.h

  #ifndef LIB_H

  #定义LIB_H

  extern C int add(int x,int y);//声明为c编译连接的外部函数。

  #endif

  //文件:lib.cpp

  #包含“lib.h”

  int add(int x,int y)

  {

  返回x y;

  }

  编译这个项目得到一个. lib文件,这个文件是一个函数库,提供了add的功能。在头文件和。lib文件提交给用户,用户可以直接使用添加功能。

  标准Turbo C2.0中的c库函数(我们使用scanf、printf、memcpy、strcpy等。)来自这个静态库。

  让我们看看如何使用这个库,并在libTest项目所在的工作区中创建新的libCall项目。调用项目只包含一个main.cpp文件,演示了静态链接库的调用方法。其源代码如下:

  引用:

  #包含stdio.h

  #包含./lib.h

  # pragma注释(lib,.//debug//libtest . lib )//指定与静态库连接。

  int main(int argc,char* argv[])

  {

  printf( 2 3=%d ,add( 2,3));

  }

  静态链接库的调用就是这么简单,也许我们每天都在用,但是我们并不理解这个概念。代码# pragma注释(lib,//debug//libTest.lib )意味着。这个文件生成的obj文件应该是用libtest.lib连接的,如果不是用#pragma注释指定,可以直接在VC中设置,如图2所示。依次选择工具、选项、目录、库文件菜单或选项,填写库文件路径。图2中红色圆圈部分是我们添加的libTest.lib文件的路径。

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

  这个静态链接库的例子至少让我们明白了什么是库函数,库函数从何而来。现在我们有以下模糊的认识:

  (1)图书馆不是怪物。写库程序和写通用程序差别不大,但是库不能单独执行;

  (2)库提供了一些可以被其他程序调用的东西。如果其他程序要调用它,必须指明要用某种方式调用。

  从上面对静态链接库的分析得出的库的无知概念,可以直接推广到动态链接库。动态链接库和静态链接库在编写和调用上的区别,体现在库的外部接口定义和调用方式略有不同。

  3.调试和查看库

  在深入到各种dll的详细描述之前,有必要先介绍一下库文件的调试和查看方法,因为下一节我们将面对大量的实例项目。

  由于库文件不能单独执行,当按F5(开始调试模式执行)或CTRL F5(运行)执行时,弹出如图3所示的对话框,要求用户输入可执行文件的路径,开始执行库函数。这时候我们可以通过输入EXE文件的路径来调用这个库来调试这个库,其调试技巧和一般的应用工程是一样的。

  3库的调试和“运行”

  通常有一个比上面更好的调试方法,就是将库项目和应用项目(调用库的项目)放在同一个VC工作区,只调试应用项目,在应用项目调用库函数的语句处设置断点,执行后再按F11,从而单步执行库函数。第2节中的libTest和libCall项目位于同一个工作区,它们的工程结构如图4所示。

  图4将库项目和调用库的项目放入同一个工作区进行调试。

  以上调试方法对于静态链接库和动态链接库是一致的。因此,本文提供下载的所有源代码都包括库工程和库调用工程,两者都包含在一个工作区中,这也是作者提供这个包下载的意图。

  动态链接库中的导出接口可以用Visual C的Depends工具查看,下面我们用Depends打开系统目录中的user32.dll,看到了吗?红圈的MessageBox有好几个版本!原来真的在这里,原来在这里!

  图5用依赖项查看DLL

  当然,依赖工具也可以显示dll的层次结构。如果用它打开一个可执行文件,可以看到这个可执行文件调用了哪些dll。

  好了,让我们正式进入动态链接库的世界。我们先来看看最常见的DLL,也就是非MFC DLL。

  [本帖由only_over于2005年11月13日21: 34重新编辑]

  拿着毕业证和简历,从差点没把我推上顶峰的招聘中心出来,一无所获。我上了一辆人力车,骑了3圈。

  是的,三轮司机问我:“你是XX农大今年的毕业生吗?”我说:“真巧,我是XX农大8。”

  8班的毕业生指着路边一个穿鞋的老人:“那个哥哥更早,77班的”。我差点没从3

  轮子掉了。

  [所有者] 发布时间:2005-11-13 11:45

动态链接库dll,vs查看dll源码