【问题标题】:Enumerate global methods of a unit using delphi使用delphi枚举一个单元的全局方法
【发布时间】:2011-04-23 07:51:10
【问题描述】:

假设我有一个这样的单位

unit sample;

interface

function Test1:Integer;
procedure Test2;

implementation

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

procedure Test2;
begin

end;

end.

是否可以在运行时枚举单元sample的所有程序和函数?

【问题讨论】:

  • @Kirk,你的真正目的是什么?

标签: delphi delphi-2010 delphi-xe


【解决方案1】:

您可以使用JCL 及其出色的 JclDebug.pas 从某种调试信息(TD32、映射文件、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;

【讨论】:

    【解决方案2】:

    没有。不会为独立方法生成 RTTI。希望这将在以后的版本中得到修复,(他们可能需要一个 TRttiUnit 类型来做到这一点,)但现在它不可用。

    【讨论】:

      【解决方案3】:

      我不这么认为。

      这是一个编译时配置,它用于编译器知道哪个函数名被调用或不被调用。据我所知,在运行时没有什么可以接近列出这些函数。

      Delphi 出色的运行时特性来自 RTTI,您可能想了解它提供的与此相关的功能。但正如我所说,我认为这是不可能的(知道我已经研究 RTTI 很长一段时间了......)。

      编辑:哦,顺便说一句,在编译后,函数会丢失它们人类可读的名称(地址)。有一些表格可以将这些名称精确到地址,最值得注意的是 RTTI 和调试信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        • 2017-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多