我尝试做的是获取没有实例的类中的字段列表...例如:
TAClass=class
a_: Integer;
b_: Integer;
constructor (a,b Integer);
end;
我无法从VMT获取fieldTable:
ovmt: PVmt;
ftable: PVmtFieldTable;
finfo: PVmtFieldEntry;
ovmt:=PVmt(TAClass);
ftable := ovmt^.vfieldtable
finfo := ftable^.fields[0]
这样我就不会得到字段列表
欢迎任何帮助, 提前谢谢
答案 0 :(得分:0)
Afaik经典delphi中的字段表和FPC仅适用于已发布的字段。已发布的字段必须是类字段(整数等值类型必须通过属性)。较新的Delphi也允许RTTI用于非发布字段,但其工作方式不同(不同的版本),而FPC尚不支持。
我一起攻击了一个小的演示示例,因为typinfo的帮助似乎很清楚。注意持续推导。
{$mode delphi}
uses typinfo,classes;
type
TAClass=class(Tpersistent)
a: tstringlist;
b: tlist;
end;
var
ovmt: PVmt;
FieldTable: PVMTFieldTable;
PVMTFieldEntry;
i: longint;
begin
ovmt := PVmt(TAClass);
while ovmt <> nil do
begin
FieldTable := PVMTFieldTable(ovmt^.vFieldTable);
if FieldTable <> nil then
begin
FieldInfo := @FieldTable^.Fields[0];
for i := 0 to FieldTable^.Count - 1 do
begin
writeln(fieldinfo^.name);
FieldInfo := PvmtFieldEntry(PByte(@FieldInfo^.Name) + 1 + Length(FieldInfo^.Name));
end;
end;
{ Try again with the parent class type }
ovmt:=ovmt^.vParent;
end;
端。