DELPHI 动态链接库DLL断点调试.docx
- 文档编号:726350
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:15
- 大小:1.69MB
DELPHI 动态链接库DLL断点调试.docx
《DELPHI 动态链接库DLL断点调试.docx》由会员分享,可在线阅读,更多相关《DELPHI 动态链接库DLL断点调试.docx(15页珍藏版)》请在冰点文库上搜索。
DELPHI动态链接库DLL断点调试
DELPHI2010动态链接库DLL断点调试
马根峰
(广东联合电子服务股份有限公司,广州510300)
摘要:
本文详细介绍了Delphi2010中的动态链接库DLL断点调试技术
关键词:
DELPHI2010;Dll断点调试;
1Delphi几个经典版本简介
Delphi从1995年的1.0版本,发展到现在的最新的XE3版本,历经N多版本,但最为经典的几个版本个人觉得应属7.0、2007和2010。
Delphi7.0应该是Delphi用户最多的版本。
Delphi2007是功能就不多说了,归根结底一句话,它是AnsiString的最后一个版本,在Delphi2007中,string类型映射为AnsiString,char类型映射为AnsiChar,Pchar类型映射为PAnsiChar。
所以DELPHI低版本的程序可以较轻松地迁移到DELPHI2007版本。
Delphi2007也是Delphi程序员很容易上手的晚期版本。
从Delphi2009开始起,到现在的DelphiXE3为止,都是unicode版本。
String类型映射为UnicodeString而不是AnsiString,Char类型映射为WideChar,PChar类型映射为PWideChar。
由于Delphi7.0、2007和2010在界面上乃至功能上的一些变化,所以在动态链接库DLL断点调试上,有较大的变化。
在今后几天的时间中,笔者会以三篇文章来分别详细地介绍Delphi7.0、2007和2010这三个版本中的DLL断点调试技术。
本篇文章来详细地介绍Delphi2010中的动态链接库DLL断点调试技术。
2DELPHI2010的DLL断点设置与DLL调试
在DELPHI7.0以及以前的版本中,动态链接库的调试方法如下:
点击菜单Run-->Parameters.打开RunParameters窗口,如图1所示。
图1点击菜单Run-->Parameters.打开RunParameters窗口
设置图中断点,然后点击F9或者Run—Run来运行宿主程序Delphi2007_Dll_Debug.exe,但发现断点无效,如图2所示:
图2设置断点后,运行宿主程序Delphi2007_Dll_Debug.exe,断点无效
点击Project-->Options..,在ProjectOptions窗口中,在DelphiCompiler—Compiling属性页中将Debuginformation设置为True,如图3所示:
图3在DelphiCompiler—Compiling属性页中将Debuginformation设置为True
点击Project-->Options..,在ProjectOptions窗口中,在DelphiCompiler—Linking属性页中将Debuginformation和Includeremotedebugsymbols两项设置为True,如图4所示:
图4将Debuginformation和Includeremotedebugsymbols两项设置为True
运行宿主程序Delphi2007_Dll_Debug.exe,断点还是无效,如图5所示:
图5运行宿主程序Delphi2007_Dll_Debug.exe,发现断点还是无效
切换到Delphi的DLL工程文件上,点击ctrl+alt+M,跳出一个名叫Modules的窗体来。
左上角显示了宿主程序本身及其它所调用的资源。
找到动态链接库Magenf_Detail.dll项,发现目录没有指向当前DLL所在的目录。
点击鼠标右键,选中菜单项“ReloadSymbolTable…”如图6所示:
图6打开Modules属性页,找到Magenf_Detail.dll项,点击鼠标右键,ReloadSymbolTable…
重新设置动态链接库Magenf_Detail.dll的位置,选中当前DLL工程Magenf_Detail所在目录的动态链接库Magenf_Detail.dll文件,如图7所示:
图7打开Modules属性页,找到Magenf_Detail.dll项,点击鼠标右键,ReloadSymbolTable…,重新设置它的位置
然后切换到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程序代码
-------宿主程序代码-----
unitUDllDebug;
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;
procedureFormCreate(Sender:
TObject);
procedureFormClose(Sender:
TObject;varAction:
TCloseAction);
procedureBtnAddClick(Sender:
TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
HInst:
Thandle;
FDll_Add:
TFarProc;
functionDll_Add:
TDll_Add;
//aForeThread:
MuliThread;
end;
var
frmDllDebug:
TfrmDllDebug;
implementation
{$R*.dfm}
procedureTfrmDllDebug.FormCreate(Sender:
TObject);
begin
hinst:
=loadlibrary('Magenf_Detail.dll');
ifhinst>0then
begin
FDll_Add:
=getprocaddress(hinst,pchar('Dll_Add'));
ifFDll_Add<>nilthen
functionDll_Add:
=TDll_Add(FDll_Add)
else
messagedlg('Fatalerror!
Functionnotbefound!
',mtWarning,[mbYes],0);
end
else
messagedlg('Fatalerror!
Magenf_Detail.dllnotbefound!
',mtWarning,[mbYes],0);
end;
procedureTfrmDllDebug.FormClose(Sender:
TObject;
varAction:
TCloseAction);
begin
try
freelibrary(hinst);
except
end;
end;
procedureTfrmDllDebug.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程序代码-----
libraryMagenf_Detail;
{ImportantnoteaboutDLLmemorymanagement:
ShareMemmustbethe
firstunitinyourlibrary'sUSESclauseANDyourproject's(select
Project-ViewSource)USESclauseifyourDLLexportsanyproceduresor
functionsthatpassstringsasparametersorfunctionresults.This
appliestoallstringspassedtoandfromyourDLL--eventhosethat
arenestedinrecordsandclasses.ShareMemistheinterfaceunitto
theBORLNDMM.DLLsharedmemorymanager,whichmustbedeployedalong
withyourDLL.ToavoidusingBORLNDMM.DLL,passstringinformation
usingPCharorShortStringparameters.}
uses
SysUtils,Classes;
{$R*.RES}
functionDll_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程序代码-----
作者简介:
马根峰,硕士,研究方向:
数据库应用。
创建了“万能数据库查询分析器”,中文版本《DB查询分析器》、《DBQueryAnalyzer》。
中文版本《DB查询分析器》在国内最大的软件下载网站---中关村在线的数据库下载排行榜中,位于前20位,下载量达到9万次。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DELPHI 动态链接库DLL断点调试 动态 链接 DLL 断点 调试