2010-10-09 42 views
4

單位的全局方法假設我有一個像這樣枚舉用delphi

unit sample; 

interface 

function Test1:Integer; 
procedure Test2; 

implementation 

function Test1:Integer; 
begin 
result:=0; 
end; 

procedure Test2; 
begin 

end; 

end. 

單位可以枚舉運行單位sample的所有過程和函數?

+0

@Kirk,究竟是你的目的是什麼? – Vantomex 2010-10-10 01:05:08

回答

6

編號RTTI不針對獨立方法生成。希望這將在更高版本中得到修復(他們可能需要一個TRttiUnit類型才能完成此操作),但現在它不可用。

0

我不這麼認爲。

這是一個編譯時配置,它被用來讓編譯器知道哪個函數名被調用。據我所知,在運行時沒有任何東西能夠列出這些函數。

德爾福卓越的運行時特性來自RTTI,您可能想看看它提供的相關信息。但正如我所說,我不認爲這是可能的(知道我已經鑽研RTTI很長一段時間了......)。

編輯:哦,順便說一句,編譯後,功能失去了人類可讀的名稱(地址)。有一些表格將這些名稱指向地址,最顯着的是RTTI和調試信息。

1

您可以使用JCL及其傑出的JclDebug.pas從某種調試信息(TD32,Map文件,Jdbg等)中提取該信息。

試試這個:

uses 
    JclDebug; 

type 
    TProc = record 
    name: string; 
    addr: Pointer; 
    end; 

    TProcArray = array of TProc; 
    TMapLoader = class 
    private 
    FModule: Cardinal; 
    FProcs: TProcArray; 
    FMapFileName: string; 
    FUnitName: string; 
    procedure HandleOnPublicsByValue(Sender: TObject; const Address: TJclMapAddress; const Name: string); 
    public 
    constructor Create(const AFileName: string; AModule: Cardinal; const AUnitName: string); 
    procedure Scan(); 
    property Procs: TProcArray read FProcs; 
    end; 

constructor TMapLoader.Create(const AFileName: string; AModule: Cardinal; const AUnitName: string); 
begin 
    inherited Create; 
    FMapFileName := AFileName; 
    FModule := AModule; 
    FUnitName := AUnitName; 
end; 

procedure TMapLoader.HandleOnPublicsByValue(Sender: TObject; const Address: TJclMapAddress; const Name: string); 
var 
    l: Integer; 
begin 
    if Pos(FUnitName + '.', Name) = 1 then 
    begin 
    l := Length(FProcs); 
    SetLength(FProcs, l + 1); 
    FProcs[l].name := Name; 
    FProcs[l].addr := Pointer(Address.Offset + FModule + $1000); 
    end; 
end; 

procedure TMapLoader.Scan(); 
var 
    parser: TJclMapParser; 
begin 
    parser := TJclMapParser.Create(FMapFileName, FModule); 
    try 
    parser.OnPublicsByValue := HandleOnPublicsByValue; 
    parser.Parse; 
    finally 
    parser.Free; 
    end; 
end;