1. 程式人生 > >DELPHI 2010 動態連結庫DLL斷點除錯

DELPHI 2010 動態連結庫DLL斷點除錯

DELPHI 2010 動態連結庫DLL斷點除錯

馬根峰

(廣東聯合電子服務股份有限公司,廣州 510300)

摘要:本文詳細介紹了Delphi 2010中的動態連結庫DLL斷點除錯技術

關鍵詞DELPHI 2010Dll斷點除錯;

1Delphi幾個經典版本簡介

Delphi1995年的 1.0版本,發展到現在的最新的XE3版本,歷經N多版本,但最為經典的幾個版本個人覺得應屬 7.02007 2010

Delphi 7.0應該是Delphi使用者最多的版本。

Delphi 2007是功能就不多說了,歸根結底一句話,它是 AnsiString的最後一個版本,在Delphi 2007中,string型別對映為AnsiString

char型別對映為AnsiCharPchar型別對映為PAnsiChar。所以DELPHI低版本的程式可以較輕鬆地遷移到DELPHI 2007版本。Delphi 2007也是Delphi程式設計師很容易上手的晚期版本。

Delphi2009開始起,到現在的Delphi XE3為止,都是 unicode版本。String型別對映為 UnicodeString而不是 AnsiStringChar型別對映為 WideCharPChar型別對映為 PWideChar

由於Delphi 7.02007 2010在介面上乃至功能上的一些變化,所以在動態連結庫DLL斷點除錯上,有較大的變化。在今後幾天的時間中,筆者會以三篇文章來分別詳細地介紹

Delphi 7.02007 2010這三個版本中的DLL斷點除錯技術。

本篇文章來詳細地介紹 Delphi 2010中的動態連結庫DLL斷點除錯技術。

2    DELPHI 2010DLL斷點設定與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所示: 

3Delphi Compiler—Compiling屬性頁中將Debug information設定為True

點選Project-->Options..,在Project Options視窗中,在Delphi Compiler—Linking屬性頁中將Debug informationInclude remote debug symbols兩項設定為True,如圖4所示: 
4Debug informationInclude remote debug symbols兩項設定為True

執行宿主程式Delphi2007_Dll_Debug.exe,斷點還是無效,如圖5所示:
 

5執行宿主程式Delphi2007_Dll_Debug.exe,發現斷點還是無效

切換到DelphiDLL工程檔案上,點選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,輸入 12後點擊銨鈕“=”,如圖9所示: 
 

9Delphi2007_Dll_Debug.exe,輸入 12後點擊銨鈕“=

進入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程式程式碼-----

作者部落格: