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

马根峰

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

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

关键词:DELPHI 2010;Dll断点调试;

1      Delphi几个经典版本简介

Delphi从1995年的 1.0版本,发展到现在的最新的XE3版本,历经N多版本,但最为经典的几个版本个人觉得应属 7.0、2007和 2010。

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

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

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

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

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

2    DELPHI 2010的DLL断点设置与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 information和Include remote debug symbols两项设置为True,如图4所示:  
       图4 将Debug information和Include remote debug symbols两项设置为True

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

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

切换到Delphi的DLL工程文件上,点击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,输入 1和2后点击铵钮“=”,如图9所示: 
 

图9 在Delphi2007_Dll_Debug.exe,输入 1和2后点击铵钮“=”

进入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程序代码-----

delphi 2010 动态链接库DLL断点调试的更多相关文章

  1. c语音 dll断点调试方法

    转自:https://blog.csdn.net/qingzai_/article/details/45348613 dll调试方法: 1.把最新生成的dll和pdb放到 启动这个dll 的进程目录下 ...

  2. Delphi dll 断点调试

    1.dll 要有一个依托的exe(怎么做 相信用dll了一定知道) 2.选项中的compling中的debugging中的选项,linking中的所有选项 3.最后一个也就是最重要的 run中的par ...

  3. DLL断点调试

    一般来说调试DLL是把DLL工程和exe工程放到一个解决方案里.如果不放到一个解决方案里,那两者的输出目录要一致,属性-连接器-常规-输出目录.保证dll,dll的pdb,exe,exe的pdb在一个 ...

  4. [转]Delphi 中动态链接库(dll)的建立和使用

    动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源.由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可 ...

  5. 采用Reflector的VS.net插件断点调试无源码DLL 分类:

    .Net的编程利器Reflector可以反编译基于.net开发的应用程序和DLL,其功能强大不用多说.今天想试验一把利用VS.net的插件断点调试外部无源码的DLL(只要是程序集都可以,所以exe也行 ...

  6. Delphi 2010 安装及调试

    呵呵,毫不客气地说,Delphi 2010 这个版本可以算是 Delphi 的一个“里程碑”,为什么这么说?因为这个版本实现了几个 Delphi 应该有却一直没有的功能 Delphi 2010 的新功 ...

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

    VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...

  8. 深入Delphi下的DLL编程

    深入Delphi下的DLL编程 作者:岑心 引 言 相信有些计算机知识的朋友都应该听说过“DLL”.尤其是那些使用过windows操作系统的人,都应该有过多次重装系统的“悲惨”经历——无论再怎样小心, ...

  9. VC++动态链接库(DLL)编程深入浅出(转帖:基础班)

    1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了“无库-静 ...

随机推荐

  1. [置顶] SVN服务器搭建和使用

    Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了,下载地址: http:// ...

  2. kafka consumer频繁reblance

    转载请注明地址http://www.cnblogs.com/dongxiao-yang/p/5417956.html 结论与下文相同,kafka不同topic的consumer如果用的groupid名 ...

  3. java的任务监听器监听任务

    Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务. 使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行.一般用的较少 监听 ...

  4. c#语言基础编程—string

    引言 在c#中经常会有相关的string的操作,string类型为引用类型,集成于Object,所以会有四个方法.详情可见 值类型和引用类型的区别 里面详细介绍了,值类型和引用类型的区别和应用场合,所 ...

  5. 【Android - 框架】之Fresco的使用

    当下有很多图片加载框架,常见的有Glide.Fresco.Picasso等.Glide因为其体积小.缓存机制强大等优点,受到了广大程序员的青睐:Fresco虽然体积比较大,缓存机制也没有Glide强大 ...

  6. 数据库中存储日期的字段类型究竟应该用varchar还是datetime ?

    背景: 前段时间在百度经验看到一篇文章<如何在电脑右下角显示你(爱人)的名字>,之前也听过这个小技巧,但没真正动手设置过.所以出于好奇就实践了一下. 设置完成后的效果例如以下.右下角的时间 ...

  7. MySQL 5.6初始配置调整

    原文链接: What to tune in MySQL 5.6 after installation原文日期: 2013年09月17日翻译日期: 2014年06月01日翻译人员: 铁锚 随着 大量默认 ...

  8. IOS-tableView中的cellHeadView随着table滚动

    IOS-tableView中的cellHeadView随着table滚动 设置table的style 首先要将table设置为UITableViewStyleGrouped类型.这样就会得到table ...

  9. 如何进去bios设置

    1.BIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统".其实,它是一组固化到计算机内主板上 ...

  10. shell入门之变量测试 分类: 学习笔记 linux ubuntu 2015-07-10 15:49 31人阅读 评论(0) 收藏

    格式:test 测试条件 字符串测试: 注意空格: test str1 == str2 测试字符串是否相等 test str1 != str2 测试字符串是否不相等 test str1 测试字符串是否 ...