深入浅出Visual C++动态链接库(Dll)编程

时间:2021-03-08 15:48:46





文章作者:宋宝
信息来源:天极网

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

  动态链(DLL)Windows的核心,也是COM的基,因此突破动态链一直是技的攻,本期专题将由浅入深的介绍动态链的基慨念、分实现用。


慨念

1.

  先来述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供你一些可以直接拿来用的量、函数或。在仓库展史上经历-静态链动态链代。静态链动态链都是共享代的方式,如果采用静态链你愿不愿意,lib中的指令都被直接包含在最生成的EXE文件中了。但是若使用DLLDLL不必被包含在最EXE文件中,EXE文件可以动态地引用和卸载这个与EXE独立的DLL文件。静态链动态链的另外一个区在于静态链中不能再包含其他的动态链或者静态库,而在动态链可以再包含其他的动态或静态链

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

  (1DLL 制与具体的言及编译器无

  只要遵循定的DLL接口范和用方式,用各种语写的DLL都可以相互。譬如Windows提供的系DLL(其中包括了WindowsAPI),在任何开发环境中都能被用,不在乎其是Visual BasicVisual C++Delphi

  (2动态链

  我Windows下的system32文件中会看到kernel32.dlluser32.dllgdi32.dllwindows的大多数API都包含在DLL中。kernel32.dll中的函数主要理内存管理和度;user32.dll中的函数主要控制用界面;gdi32.dll中的函数则负责图形方面的操作。

  一般的程序都用过类MessageBox的函数,其它就包含在user32.dll动态链中。由此可DLL并不陌生。

  (3)VC动态链的分

  Visual C++支持三DLL,它Non-MFC DLL(非MFC动态库)、MFC Regular DLLMFC规则DLL)、MFC Extension DLLMFCDLL)。

  非MFC动态库不采用MFC类库结构,其出函数为标准的C接口,能被非MFCMFC写的用程序所用;MFC规则DLL 包含一个承自CWinApp,但其无消息循MFCDLL采用MFC动态链接版本建,它只能被用MFC类库写的用程序所用。

  由于本文篇幅较长,内容多,必需要先对阅读本文的有项进明,下面以答形式出。

  :本文主要解什内容?

  答:本文详细DLL程的方方面面,努力学完本文可以DLL全面的掌握,并能写大多数DLL程序。

  :如何看本文?

  答:本文一个主解都附了源代例程,可以随文下个工程都WINRAR压缩)。所有些例程都由笔者写并在VC++6.0调试

  当然看懂本文不是者的最目的,应亲践才能真正掌握DLL的奥妙。

  :学本文需要什么样的基

  答:如果你掌握了C,并大致掌握了C++,了解一点MFC的知,就可以松地看懂本文。

  2.态链

  态链解不是本文的重点,但是在具体DLL之前,通一个静态链的例子可以快速地帮助我建立的概念。

[/img]http://dev.yesky.com/imagelist/05/10/6v58bw881n81.jpg[/img]

    1 建立一个静态链

1,在VC++6.0new一个名称libTeststatic library工程(单击本工程),并新建lib.hlib.cpp两个文件,lib.hlib.cpp的源代如下:

QUOTE:


//
文件: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函数(我用来的scanfprintfmemcpystrcpy等)就来自这种态库

  下面来看看怎使用,在libTest工程所在的工作区内new一个libCall工程。libCall工程包含一个main.cpp文件,它演示了静态链用方法,其源代如下:

QUOTE:


#include <stdio.h>
#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,依次选择toolsoptionsdirectorieslibrary files选项,填入文件路径。2中加圈的部分添加的libTest.lib文件的路径。


2 VC文件路径

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

  (1不是个怪物,的程序和写一般的程序区不大,只是不能行;

  (2提供一些可以给别的程序用的东东的程序要用它必以某方式指明它要用之。

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


3.调试

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

  由于文件不能行,因而在按下F5debug模式行)或CTRL+F5(运行),其出如3所示的对话框,要求用户输入可行文件的路径来启动库函数的行。候我们输入要该库EXE文件的路径就可以对库进调试了,其调试技巧与一般用工程的调试


3 调试运行

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


4 把工程和的工程放入同一工作区调试

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

  动态链中的出接口可以使用Visual C++Depends工具看,Depends中的user32.dll,看到了吧?圈内的就是几个版本的MessageBox了!原来它真的在里啊,原来它就在里啊!


5 用DependsDLL

  当然Depends工具也可以DLL构,若用它打一个可行文件可以看出个可行文件用了哪些DLL

  好,正式动态链的世界,先来看看最一般的DLL,即非MFC DLL


[ only_over2005-11-13 21:34重新编辑 ]


Wind Code Close  
出来的不好看. 签鸟
-------------------

制信息安全团队,信息安全,黑客技,件下,数字取,逆向工程,听嗅探;
无限网,安全,骨干运,最新漏洞,务监.
www.eviloctal.com/ - 34k - 2006
216 - 快照 - 似网   Google 上面制粘D

无限(其线络这个字了)

[ ] From:态页面无法IP来源 | Posted:2005-11-13 11:45|