Free Pascal上的虚方法表

时间:2014-10-24 20:12:13

标签: 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^.fields[0]

这样我就不会得到字段列表

欢迎任何帮助, 提前谢谢

1 个答案:

答案 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;

端。