Verstehe nicht ganz, was los ist, aber wenn man einen Blick auf zum Beispiel IsPublishedProp
in der TypInfo
Einheit haben, werden Sie sehen, dass es den Class der Instanz als Zeiger auf eine Typeinfo Struktur wirft:
PTypeInfo(Instance.ClassInfo)
Wenn Sie die Class Methode zu buchen, es gibt einen einfachen Zeiger, dessen Wert auf die vmt Tabelle, scheint:
Result := PPointer(Integer(Self) + vmtTypeInfo)^;
vmtTypeInfo
hat einen Wert von -72. Vier Bytes davor bei -76 ist vmtInitTable
. vmtTypeInfo wird gefolgt von FieldTable, MethodTable, Dynamic usw.
der vmtInitTable Wert verwendet wird zum Beispiel in TObject.CleanupInstance
und weitergegeben _FinalizeRecord
als der Zeiger auf die Typeinfo-Struktur.
So scheinen die vier Bytes vor der TypeInfo-Struktur, die auf die TypeInfo-Struktur verweist, von Entwurf und Teil der vmt-Struktur zu sein.
bearbeiten
Als Mason zu Recht des Obige ein vollständiges Ablenkungsmanöver darauf hingewiesen (siehe Kommentar). Ich verlasse die Antwort, damit andere sie nicht verfolgen müssen.
aktualisieren Um Verwirrung über Variablen und deren Adressen zu vermeiden, habe ich Mason Testverfahren wie folgt neu gefasst:
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;
und nennen Sie es mit den folgenden Informationen:
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;
der ersten drei produzieren die Ergebnisse, die Mason beschreibt. Ich fügte nur einen zusätzlichen writelnn hinzu, um den Zeigerwert für das letzte writeln anzuzeigen. Der letzte Aufruf in TryRTTIStuff soll zeigen, dass Sie, wenn Sie keinen Zeiger auf eine gültige TypeInfo-Struktur übergeben, nicht den gleichen Wert für den ersten und dritten Schreibvorgang für den Aufruf erhalten.
Noch keine Ahnung, was mit der TypeInfo passiert. Vielleicht sollten wir Barry Kelly fragen, da er der Autor des neuen D2010 RTTI ist und daher viel über den alten wissen sollte ...
Ich nehme an, eine 'var' fehlt im obigen Code ... –
@Andreas: Wo? Ich sehe keine fehlenden vars ... –
Ups! OK, jetzt behoben. –