Eğer TypInfo
ünitesinde örneğin IsPublishedProp
için bir göz olduğu zaman, edeceğiz oluyor ama ne tamamen Dont'anlamak
PTypeInfo(Instance.ClassInfo)
Eğer ClassInfo yöntemine bakın, değeri vmt tablosuna ilişkin görünüyor basit işaretçi döndürür::
bir TypeInfo yapısına bir işaretçi olarak örneğinin ClassInfo atmalarını görüyoruz
Result := PPointer(Integer(Self) + vmtTypeInfo)^;
vmtTypeInfo
, -72 değerine sahiptir. Bundan önceki 4 bayt, vmtInitTable
'dur. vmtTypeInfo DynamicTable vb
vmtInitTable değeri TypeInfo yapısına işaretçi olarak _FinalizeRecord
örneğin TObject.CleanupInstance
için kullanılan ve geçirilen FieldTable, MethodTable ile takip edilir.
Bu nedenle TypeInfo yapısını işaret eden TypeInfo yapısından önceki dört bayt, tasarım ve vmt yapısının bir kısmı tarafından orada görünmektedir.
Düzenleme Mason haklı olarak yukarıda işaret tam bir kırmızı ringa olduğu gibi
(yorumlar). Cevabı bırakıyorum, böylece başkaları onu kovalamak zorunda kalmayacak.
değişkenler ve adreslerinin üzerinde karışıklığı önlemek için Güncelleştirme, ben şöyle Mason'ın test prosedürü tekrar yazmış:
procedure test(info: PTypeInfo);
begin
writeln('value of info : ', cardinal(info));
writeln('info - 4 : ', cardinal(info) - 4);
writeln('value 4 bytes before: ', cardinal(PPointer(cardinal(info)-4)^));
end;
ve aşağıdaki bilgilerle diyoruz:
procedure TryRTTIStuff;
begin
writeln('TPersistent');
test(TypeInfo(TPersistent));
writeln('TTypeKind enumeration');
test(TypeInfo(TTypeKind));
writeln('Integer');
test(TypeInfo(Integer));
writeln('Nonsense');
test(PTypeInfo($420000));
end;
ilk Üç, Mason'un tarif ettiği sonuçları üretir. Sadece son yazara ait işaretçi değerini göstermek için ekstra bir writeln ekledim. TryRTTIStuff'daki son çağrı, bir gösterici içinde geçerli bir TypeInfo yapısına geçmediğinizde, ilk ve üçüncü writeln'lerin çağrı için aynı değeri alamadığınızı göstermektir.
TypeInfo ile neler olup bittiğine dair bir ipucu yok. Belki de Barry Kelly'ye yeni D2010 RTTI'nin yazarı olduğunu sormalıyız, bu yüzden de eski bir tane hakkında çok şey bilmeli ...
Yukarıdaki kodda bir "var" eksik olduğunu varsayalım ... –
@Andreas: Nerede? Eksik varsayı göremiyorum ... –
Oops! Tamam, şimdi düzeltildi. –