4

私はこのようなユニットを持っているとしましょう

unit sample;

interface

function Test1:Integer;
procedure Test2;

implementation

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

procedure Test2;
begin

end;

end.

実行時にユニットのすべての手順と機能を列挙することは可能sampleですか?

4

3 に答える 3

6

いいえ。スタンドアロンメソッドのRTTIは生成されません。うまくいけば、これは後のバージョンで修正されるでしょう(おそらくそれを行うにはTRttiUnitタイプが必要です)が、今のところ利用できません。

于 2010-10-10T03:43:07.513 に答える
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;
于 2011-07-31T02:20:12.723 に答える
0

私はそうは思わない。

これはコンパイル時の構成であり、コンパイラーがどの関数名が呼び出されているかを知るために使用されます。私の知る限り、これらの関数のリストに近いものは実行時にありません。

Delphiの優れたランタイム機能はRTTIに由来するため、これに関連してDelphiが提供するものを確認することをお勧めします。しかし、私が言ったように、それは可能ではないと思います(私がRTTIでかなり長い間掘り下げてきたことを知っています...)。

編集:ああ、ちなみに、コンパイル後、関数は人間が読める形式の名前を(アドレスに)失います。これらの名前をアドレスに特定するテーブルがいくつかあります。特に、RTTIとデバッグ情報です。

于 2010-10-09T22:50:03.873 に答える