zoukankan      html  css  js  c++  java
  • delphi 2010 动态链接库DLL断点调试

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

               马根峰 

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

     

    摘要:本文详细介绍了Delphi 2010中的动态链接库DLL断点调试技术

    关键词DELPHI 2010Dll断点调试;

     

    1      Delphi几个经典版本简介 

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

    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.02007 2010在界面上乃至功能上的一些变化,所以在动态链接库DLL断点调试上,有较大的变化。在今后几天的时间中,笔者会以三篇文章来分别详细地介绍Delphi 7.02007 2010这三个版本中的DLL断点调试技术。

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

     

     

     

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

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

    点击菜单Run-->Parameters.打开Run Parameters窗口,如图1所示。 

          图1 点击菜单Run-->Parameters.打开Run Parameters窗口

     

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

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

     

    点击Project-->Options..,在Project Options窗口中,在Delphi Compiler—Compiling属性页中将Debug information设置为True,如图3所示: 

          3 Delphi Compiler—Compiling属性页中将Debug information设置为True

     

    点击Project-->Options..,在Project Options窗口中,在Delphi Compiler—Linking属性页中将Debug informationInclude remote debug symbols两项设置为True,如图4所示:  
           
    4 Debug informationInclude remote debug symbols两项设置为True

     

    运行宿主程序Delphi2007_Dll_Debug.exe,断点还是无效,如图5所示:
     

          5 运行宿主程序Delphi2007_Dll_Debug.exe,发现断点还是无效

     

    切换到DelphiDLL工程文件上,点击ctrl+alt+M,跳出一个名叫Modules的窗体来。左上角显示了宿主程序本身及其它所调用的资源。

    找到动态链接库 Magenf_Detail.dll项,发现目录没有指向当前DLL所在的目录。点击鼠标右键,选中菜单项“Reload Symbol Table…”如图6所示:
     
     

          6 打开Modules属性页,找到Magenf_Detail.dll项,点击鼠标右键,Reload Symbol Table…

     

    重新设置动态链接库Magenf_Detail.dll的位置,选中当前DLL工程Magenf_Detail所在目录的动态链接库Magenf_Detail.dll文件,如图7所示:
     
     

          7 打开Modules属性页,找到Magenf_Detail.dll项,点击鼠标右键,Reload Symbol Table…,重新设置它的位置

     

    然后切换到Delphi的属性页Magenf_Detail,发现断点生效,如图8所示:
     

          8 点击属性页Magenf_Detail,发现断点生效

     

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

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

     

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



          
    10 进入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(&apos;Fatal error! Function not be found!&apos;,mtWarning, [mbYes], 0) ;

             end

             else

                 messagedlg(&apos;Fatal error! Magenf_Detail.dll not be found!&apos;,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程序代码-----

  • 相关阅读:
    自己动手用Javascript写一个无刷新分页控件
    自己动手写一个通用的分页存储过程(适用于多表查询)
    Towards Accurate Multiperson Pose Estimation in the Wild 论文阅读
    统计学习方法c++实现之一 感知机
    2018百度之星开发者大赛-paddlepaddle学习(二)将数据保存为recordio文件并读取
    2018百度之星开发者大赛-paddlepaddle学习
    [转载]C#_Path类常用操作
    安装SQL2K是的文件挂起错误
    相见恨晚MySQL 多表查询
    php截取字符串,出现乱码
  • 原文地址:https://www.cnblogs.com/s-Yang/p/3152082.html
Copyright © 2011-2022 走看看