在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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所示:
运行宿主程序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所示:
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程序代码----- |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论