自由Pascal上的虚方法表

自由Pascal上的虚方法表,pascal,vmt,Pascal,Vmt,我要做的是在没有实例的类中获取字段列表。。。例如: 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^.f

我要做的是在没有实例的类中获取字段列表。。。例如:

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]
这样我就不会得到字段列表

欢迎任何帮助,
提前感谢

Afaik经典delphi和FPC中的字段表仅适用于已发布的字段。已发布的字段必须是类字段(值类型(如integer)必须通过属性)。较新的Delphi也允许对未发布的字段使用RTTI,但其工作方式不同(不同的UNTI),FPC还不支持这一点

我拼凑了一个小的演示示例,因为typinfo的帮助似乎很简单。请注意tpersistent派生

{$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;
{$modedelphi}
使用typinfo,类;
类型
t类=类(t持久)
a:tstringlist;
b:tlist;
结束;
变量
ovmt:PVmt;
FieldTable:PVMTFieldTable;
PVMTFieldEntry;
i:长型;
开始
ovmt:=PVmt(塔类);
而ovmt nil做什么
开始
FieldTable:=PVMTFieldTable(ovmt^.vFieldTable);
如果字段表为nil,则
开始
FieldInfo:=@FieldTable^.Fields[0];
对于i:=0到FieldTable^.Count-1 do
开始
writeln(fieldinfo^.name);
FieldInfo:=PvmtFieldEntry(PByte(@FieldInfo^.Name)+1+长度(FieldInfo^.Name));
结束;
结束;
{请使用父类类型重试}
ovmt:=ovmt^.vParent;
结束;
结束