DELPHI 2007 动态链接库DLL断点调试

Posted magenfeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DELPHI 2007 动态链接库DLL断点调试相关的知识,希望对你有一定的参考价值。

 

  DELPHI 2007动态链接库DLL断点调试         

                          马根峰

( 广东联合电子服务股份有限公司, 广州510300) 

作者博客:

CSDN博客:http://blog.csdn.net/magenfeng

新浪博客: http://blog.sina.com.cn/magenfeng

QQ空间: http://user.qzone.qq.com/630414817

  

1      Delphi几个经典版本简介  

          Delphi1995年的1.0版本,发展到现在的最新的XE3版本,历经N多版本,但最为经典的几个版本个人觉得应属7.020072010 

Delphi 7.0应该是Delphi用户最多的版本。 

Delphi 2007是功能就不多说了,归根结底一句话,它是AnsiString的最后一个版本,在Delphi 2007中,string类型映射为AnsiStringchar类型映射为AnsiCharPchar类型映射为PAnsiChar。所以DELPHI低版本的程序可以较轻松地迁移到DELPHI 2007版本。Delphi 2007也是Delphi程序员很容易上手的晚期版本。

Delphi2009开始起,到现在的Delphi XE3为止,都是unicode版本。String类型映射为UnicodeString而不是AnsiStringChar类型映射为WideCharPChar类型映射为PWideChar

由于Delphi 7.020072010在界面上乃至功能上的一些变化,所以在动态链接库DLL断点调试上,有较大的变化。在今后几天的时间中,笔者会以三篇文章来分别详细地介绍Delphi 7.020072010这三个版本中的DLL断点调试技术。 

本篇文章来详细地介绍Delphi 2007中的动态链接库DLL断点调试技术。

 

2        DELPHI 2007 DLL断点设置与DLL调试

      DELPHI 7.0以及以前的版本中,动态链接库的调试方法如下:

点击菜单Run-->Parameters.打开Run Parameters窗口,在Host application中选中宿主程序,如图1所示。
 
 

        打开Run Parameters窗口,在Host application中选中宿主程序

 

设置图中断点,然后点击F9或者Run—Run来运行宿主程序Delphi2007_Dll_Debug.exe,但发现断点无效,如图2所示:

 
           设置断点后,运行宿主程序Delphi2007_Dll_Debug.exe,断点无效

 

点击Project-->Options..,在Project Options窗口中,点击Compiler,选中Debug information,如图3所示:


  Project Options窗口中,点击Compiler,选中Debug information 

点击Project-->Options..,在Project Options窗口中,点击Linker可以看到Include TD32 debug InfoInclude remote debug symbols两项为非选中状态,如图4所示:  

       Include TD32 debug InfoInclude remote debug symbols两项为非选中状态。

 

选中Include TD32 debug InfoInclude remote debug symbols,如图5所示:
  

选中Include TD32 debug InfoInclude remote debug symbols
 

然后点击F9或者Run—Run来运行宿主程序Delphi2007_Dll_Debug.exe,但发现断点生效,如图6所示:
  

      图运行宿主程序,发现断点生效

 

Delphi2007_Dll_Debug.exe,输入12后点击铵钮“=”,如图7所示:

  
Delphi2007_Dll_Debug.exe,输入12后点击铵钮“=

 

进入DLL断点调试,如图8所示:
  

    图进入DLL的断点调试

    

3        例子中的宿主程序及DLL程序代码

-------宿主程序代码-----

unit UDllDebug;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ExtCtrls, Buttons,  Contnrs ,   ActiveX, StrUtils ;

 

type

 

  

 

    

  TDll_Add=function(int_1,int_2:integer):integer;stdcall;

  TfrmDllDebug = class(TForm)

    Edit1: TEdit;

    Edit2: TEdit;

    Label1: TLabel;

    Edit3: TEdit;

    BtnAdd: TButton;

    procedure FormCreate(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    procedure BtnAddClick(Sender: TObject);

  private

    Private declarations

  public

    Public declarations

 

    HInst:Thandle;                                    

    FDll_Add:TFarProc;

    functionDll_Add:TDll_Add;

 

    //aForeThread:MuliThread;

  end;

 

var

  frmDllDebug: TfrmDllDebug;

 

implementation

 

$R *.dfm

 

 

 

               

  

procedure TfrmDllDebug.FormCreate(Sender: TObject);

begin

       hinst:=loadlibrary('Magenf_Detail.dll'); 

       if hinst>0 then

       begin

              FDll_Add:=getprocaddress(hinst,pchar('Dll_Add'));

 

              if FDll_Add<>nil then

                 functionDll_Add:=TDll_Add(FDll_Add)

              else

                 messagedlg('Fatal error! Function not be found!',mtWarning, [mbYes], 0) ;

         end

         else

              messagedlg('Fatal error!  Magenf_Detail.dll not be found!',mtWarning, [mbYes], 0) ;

 

end;

 

procedure TfrmDllDebug.FormClose(Sender: TObject;

  var Action: TCloseAction);

begin

    try

        freelibrary(hinst);

    except

    end;

 

end;

        

 

 

 

 

procedure TfrmDllDebug.BtnAddClick(Sender: TObject);

var

    int1,int2,int_return:integer;

begin

 

    int1:=strToInt(edit1.Text);

    int2:=strToInt(edit2.Text);

    int_return:=functionDll_Add(int1,int2);

    edit3.Text :=intToStr(int_return);

 

end;

 

end.

-------宿主程序代码-----

 

--------------DLL程序代码------------

library Magenf_Detail;

 

uses

  SysUtils,Classes;

 

$R *.RES

 

 

function    Dll_Add(int_1,int_2:integer):integer;stdcall;

var

     intSum:integer;

begin

    intSum:=int_1+int_2;

    result:=intSum;

end;

 

 

exports

    Dll_Add;

 

end.

 

--------------DLL程序代码------------

 

 

 

备注:

Delphi 2007中调试动态链接库DLL的时候,在宿主程序所在目录中,如果含有要调试的动态链接库DLL生成文件(扩展名为dll),为避免引起不必要的麻烦,请将其删除,然后再进行以上的调试过程。

 

 


以上是关于DELPHI 2007 动态链接库DLL断点调试的主要内容,如果未能解决你的问题,请参考以下文章

在 Delphi 2007 中丢失了一些调试功能

Delphi 动态链接库的动态和静态调用 (仔细读一下)

Delphi Dll 动态调用例子-仔细看一下

delphi调试技巧

Delphi 怎么创建动态库?

无法定位程序输入点InitializeSRWLock于动态链接库KERNEL32.dll 上