使用delphi枚举单元的全局方法

使用delphi枚举单元的全局方法,delphi,delphi-2010,delphi-xe,Delphi,Delphi 2010,Delphi Xe,假设我有一个这样的单位 unit sample; interface function Test1:Integer; procedure Test2; implementation function Test1:Integer; begin result:=0; end; procedure Test2; begin end; end. 是否可以在运行时枚举单元的所有过程和功能示例?我不这么认为 这是一个编译时配置,使用它是为了让编译器知道调用或不调用哪个函数名。据我所知,在运

假设我有一个这样的单位

unit sample;

interface

function Test1:Integer;
procedure Test2;

implementation

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

procedure Test2;
begin

end;

end.
是否可以在运行时枚举单元的所有过程和功能
示例

我不这么认为

这是一个编译时配置,使用它是为了让编译器知道调用或不调用哪个函数名。据我所知,在运行时没有任何东西可以接近于列出这些函数

Delphi优秀的运行时特性来自RTTI,您可能想看看它提供了哪些与此相关的功能。但正如我所说的,我认为这是不可能的(我知道我已经在RTTI上钻研了很长一段时间…)


编辑:哦,顺便说一下,在编译之后,函数会丢失其可读的名称(到地址)。有些表将这些名称精确定位到地址,最明显的是RTTI和调试信息。

否。RTTI不是为独立方法生成的。希望在以后的版本中可以解决这个问题(他们可能需要一个TRttiUnit类型来实现这一点),但目前还不可用。

您可以使用和他们的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;

@柯克,你的真正目的是什么?