Delphi-Quellcode:
function getMethodInfo(aObject:TObject;const aMethodname:string {oder aMethodaddress:pointer}):TStringList;
type PParam=^TParam;
TParam=packed record //Parameter
Paramtype:byte; //var, const, in oder out
TypInfo:PPointer; //Pointer zu TypeInfo des Parameters
ParamPos:Word; //0=eax; 1=edx; 2=ecx; ansonsten bei ebp+x
Name:ShortString;
end;
var obj:pointer;
MInfo:pointer;
count,lengthMethod:pword;
i:integer;
adr:pointer;
name:PShortstring;
Param:PParam;
typInfo:pointer;
begin
result:=TStringlist.Create;
result.NameValueSeparator:='=';
obj:=aObject.ClassType;
repeat
MInfo:=ppointer(integer(obj)+vmtMethodTable)^;
if assigned(MInfo) then
begin
count:=MInfo;
lengthMethod:=pointer(integer(count)+2);
for i:=1 to count^ do
begin
name:=pointer(integer(lengthMethod)+6);
adr:=ppointer(integer(lengthMethod)+2)^;
if name^=aMethodname then //oder "if adr=aMethodaddress then"
begin
Param:=pointer(pbyte(name)^+integer(name)+1+8); //8 für allg. Methodeninfo
while integer(param)<lengthMethod^+integer(lengthMethod) do
begin
typInfo:=Param^.TypInfo^;
name:=pointer(integer(typInfo)+1);
result.Add(param^.Name+'='+Name^);
param:=pointer(integer(param)+sizeof(TParam)-$100+pbyte(@Param^.Name)^+1);
end;
exit;
end;
lengthMethod:=pointer(integer(lengthMethod)+lengthMethod^);
end;
end;
obj:=TClass(obj).ClassParent;
until obj=nil;
end;
Die liefert dir für eine gegebene Klasse und
published Methode eine Liste mit den Parametern.
Das funktioniert ab D7 mit {$MethodInfo on}. Allerdings veranlasst der Compiler hin und wieder keine
RTTI für die Parameter. Wann genau kann ich nicht 100%ig sagen. Aber zum Beispiel, wenn ein Array direkt im MethodenHeader verwendet wird ohne das ein extra Typ deklariert wurde.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.