私はこのようなユニットを持っているとしましょう
unit sample;
interface
function Test1:Integer;
procedure Test2;
implementation
function Test1:Integer;
begin
result:=0;
end;
procedure Test2;
begin
end;
end.
実行時にユニットのすべての手順と機能を列挙することは可能sample
ですか?
私はこのようなユニットを持っているとしましょう
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、マップファイル、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に由来するため、これに関連してDelphiが提供するものを確認することをお勧めします。しかし、私が言ったように、それは可能ではないと思います(私がRTTIでかなり長い間掘り下げてきたことを知っています...)。
編集:ああ、ちなみに、コンパイル後、関数は人間が読める形式の名前を(アドレスに)失います。これらの名前をアドレスに特定するテーブルがいくつかあります。特に、RTTIとデバッグ情報です。