Gilberto Trindade
Gilberto Trindade

Reputation: 23

Delphi - get same field pointer with RTTI e Addr

Can I get the same pointer of a Field with RTTI and Addr(Field)?

eg:

TSomeClass

private FSomeField: Integer;

...

1) MyPointer = Addr(FSomeField) >> $12345

2) RTTI pointer from SameField >> $12345

Upvotes: 1

Views: 478

Answers (1)

teran
teran

Reputation: 3234

actually all you need is to get RTTI field offset (TRttiField.Offset) and add it to initial object address (instance address).

type
    TTest = class(TObject)
      private
        FInt : integer;
        FString : string;
        FBool : boolean;
    end;

var t : TTest;
    ctx : TRttiContext;
    f : TRttiField;
begin

    t := TTest.Create();
    try
        writeln(Format('FInt: %p',[@t.FInt]));
        writeln(Format('FString: %p', [addr(t.FString)]));
        writeln(Format('FBool: %p', [@t.FBool]));

        writeln('--------------');
        //field address using rtti
        ctx := TRttiContext.Create();
        try
            for f in ctx.GetType(t.ClassType).GetFields() do begin
                writeln(Format('%s: %8x', [f.Name, NativeInt(t) + f.Offset]));
            end;
        finally
            ctx.Free();
        end;

    finally
        t.Free();
    end;
    readln;
end.

Upvotes: 3

Related Questions