2014-09-25 2 views
0

RTTI 및 Addr (필드)로 필드의 동일한 포인터를 가져올 수 있습니까?Delphi - RTTI로 동일한 필드 포인터 가져 오기 e Addr

예 :

TSomeClass

개인 FSomeField : 정수;

...

1) MyPointer = 번지 기능 (FSomeField) >> SameField에서 $ 12345

2) RTTI 포인터 >> $ 12345

+0

나는 이해할 수 없다. 당신의 코드가 원하는 함수의 입력으로 정확히 무엇입니까 –

+0

특정 함수에서 RTTI로 필드의 포인터를 얻고 함수 외부에서 Addr (Field)로 같은 포인터를 얻고 싶습니다. –

+0

제 의견을 다시 읽어주십시오. 아마도 우리가 작성할 수있는 함수 선언을 보여줄 수 있습니다. –

답변

2

실제로 당신이 필요로하는 모든 RTTI 필드 오프셋을 얻을 수 있습니다 (TRttiField.Offset) 초기 오브젝트 주소 (인스턴스 주소)에 추가하십시오.

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. 
관련 문제