單位的全局方法假設我有一個像這樣枚舉用delphi
unit sample;
interface
function Test1:Integer;
procedure Test2;
implementation
function Test1:Integer;
begin
result:=0;
end;
procedure Test2;
begin
end;
end.
單位可以枚舉運行單位sample
的所有過程和函數?
單位的全局方法假設我有一個像這樣枚舉用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類型才能完成此操作),但現在它不可用。
我不這麼認爲。
這是一個編譯時配置,它被用來讓編譯器知道哪個函數名被調用。據我所知,在運行時沒有任何東西能夠列出這些函數。
德爾福卓越的運行時特性來自RTTI,您可能想看看它提供的相關信息。但正如我所說,我不認爲這是可能的(知道我已經鑽研RTTI很長一段時間了......)。
編輯:哦,順便說一句,編譯後,功能失去了人類可讀的名稱(地址)。有一些表格將這些名稱指向地址,最顯着的是RTTI和調試信息。
您可以使用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;
@Kirk,究竟是你的目的是什麼? – Vantomex 2010-10-10 01:05:08