簡體   English   中英

使用delphi枚舉單元的全局方法

[英]Enumerate global methods of a unit using delphi

假設我有一個這樣的單位

unit sample;

interface

function Test1:Integer;
procedure Test2;

implementation

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

procedure Test2;
begin

end;

end.

是否可以在運行時枚舉單元sample所有過程和功能?

否。不會為獨立方法生成RTTI。 希望在以后的版本中可以解決此問題(它們可能需要使用TRttiUnit類型來實現),但目前尚不可用。

您可以使用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;

我不這么認為。

這是一個編譯時配置,用於編譯器知道正在調用或不調用哪個函數名稱的情況。 據我所知,在運行時沒有什么可以列出這些功能。

Delphi出色的運行時功能來自RTTI,您可能想看看它與此相關的功能。 但是正如我所說,我認為這是不可能的(知道我已經在RTTI中研究了很長時間……)。

編輯:哦,順便說一句,編譯后,函數會丟失其人類可讀的名稱(至地址)。 有一些表格將這些名稱精確定位到地址,最著名的是RTTI和調試信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM