DELPHI 2010 動態連結庫DLL斷點除錯
DELPHI 2010 動態連結庫DLL斷點除錯
馬根峰
(廣東聯合電子服務股份有限公司,廣州 510300)
摘要:本文詳細介紹了Delphi 2010中的動態連結庫DLL斷點除錯技術
關鍵詞:DELPHI 2010;Dll斷點除錯;
1Delphi幾個經典版本簡介
Delphi從1995年的 1.0版本,發展到現在的最新的XE3版本,歷經N多版本,但最為經典的幾個版本個人覺得應屬 7.0、2007和 2010。
Delphi 7.0應該是Delphi使用者最多的版本。
Delphi 2007是功能就不多說了,歸根結底一句話,它是 AnsiString的最後一個版本,在Delphi 2007中,string型別對映為AnsiString
從Delphi2009開始起,到現在的Delphi XE3為止,都是 unicode版本。String型別對映為 UnicodeString而不是 AnsiString,Char型別對映為 WideChar,PChar型別對映為 PWideChar。
由於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設定斷點後,執行宿主程式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程式程式碼-----
作者部落格: