delphi 2010 动态链接库DLL断点调试
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('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 2010 动态链接库DLL断点调试的更多相关文章
- c语音 dll断点调试方法
转自:https://blog.csdn.net/qingzai_/article/details/45348613 dll调试方法: 1.把最新生成的dll和pdb放到 启动这个dll 的进程目录下 ...
- Delphi dll 断点调试
1.dll 要有一个依托的exe(怎么做 相信用dll了一定知道) 2.选项中的compling中的debugging中的选项,linking中的所有选项 3.最后一个也就是最重要的 run中的par ...
- DLL断点调试
一般来说调试DLL是把DLL工程和exe工程放到一个解决方案里.如果不放到一个解决方案里,那两者的输出目录要一致,属性-连接器-常规-输出目录.保证dll,dll的pdb,exe,exe的pdb在一个 ...
- [转]Delphi 中动态链接库(dll)的建立和使用
动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源.由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可 ...
- 采用Reflector的VS.net插件断点调试无源码DLL 分类:
.Net的编程利器Reflector可以反编译基于.net开发的应用程序和DLL,其功能强大不用多说.今天想试验一把利用VS.net的插件断点调试外部无源码的DLL(只要是程序集都可以,所以exe也行 ...
- Delphi 2010 安装及调试
呵呵,毫不客气地说,Delphi 2010 这个版本可以算是 Delphi 的一个“里程碑”,为什么这么说?因为这个版本实现了几个 Delphi 应该有却一直没有的功能 Delphi 2010 的新功 ...
- VC++动态链接库(DLL)编程深入浅出(zz)
VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...
- 深入Delphi下的DLL编程
深入Delphi下的DLL编程 作者:岑心 引 言 相信有些计算机知识的朋友都应该听说过“DLL”.尤其是那些使用过windows操作系统的人,都应该有过多次重装系统的“悲惨”经历——无论再怎样小心, ...
- VC++动态链接库(DLL)编程深入浅出(转帖:基础班)
1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了“无库-静 ...
随机推荐
- 广州Uber优步司机奖励政策(1月18日~1月24日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 关于平移的 scrollTo和scrollBy的区别
这几天在项目中要求一部分布局实现整体偏移的效果 在网上查了下我使用来ScrollBy(x,y)方法 他的意思是将view实现整体偏移 而ScollTo(x,y)则是将原点偏移到相应指定的位置即 移 ...
- 【Jsoup爬取网页内容】
思路:根据给定URL分析其源码,得到所需的网页内容的位置,制定规则采集或下载之 采集的图片和文字示例: tags: tag:brazil tag:dog tag:pet tag:pointyfaced ...
- xen credit scheduler and policy
最近在研究xen的vcpu 调度和cpu qos策略,现在默认的scheduler是credit, 对应的代码是sched_credit.c xen支持好几种控制策略,效果最好的当选pin, 灵活性最 ...
- [Javascript] Using JSHint for Linting with Gulp
gulpfile.js var gulp = require('gulp'); var jshint = require('gulp-jshint'); var stylish = require(' ...
- Qt 学习之路:线程总结
前面我们已经详细介绍过有关线程的一些值得注意的事项.现在我们开始对线程做一些总结. 有关线程,你可以做的是: 在QThread子类添加信号.这是绝对安全的,并且也是正确的(前面我们已经详细介绍过,发送 ...
- [转] JavaScript 和事件
与浏览器进行交互的时候浏览器就会触发各种事件.比如当我们打开某一个网页的时候,浏览器加载完成了这个网页,就会触发一个 load 事件:当我们点击页面中的某一个“地方”,浏览器就会在那个“地方”触发一个 ...
- iOS 复杂动画之抽丝剥茧
一.前言 随着开发者的增多和时间的累积,AppStore已经有非常多的应用了,每年都有很多新的APP产生.但是我们手机上留存的应用有限,所以如何吸引用户,成为产品设计的一项重要内容.其中炫酷的动画效果 ...
- IDLHDF5读取与转换
需求决定了动力,此时近凌晨一点,忙里偷闲,终于忙完了今天的“这点儿”事儿.参考帮助文档,从hdf的读写,捉摸hdf5的读写,总算弄明白了.稍作总结,以备候查. hdf5作为hdf数据的补充与升级,目前 ...
- gulp的常用api
gulp是什么? http://gulpjs.com/ 相信你会明白的! 与著名的构建工具grunt相比,有什么优势呢? 易于使用,代码优于配置 高效,不会产生过多的中间文件,减少I/O压力 易于学习 ...