Einzelnen Beitrag anzeigen

Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Typinformation von Records

  Alt 25. Sep 2007, 16:06
Wenn man Assembler kann, dann sieht man in der automatisch aufgerufenen Routine FinalizeRecord sehr deutlich den Aufbau. Hier meine Umsetzung:
Delphi-Quellcode:
type
TFinalField = packed record
  Typ: PPTypeInfo; //Beachte den Zeiger auf den Zeiger!
  Offset: integer;
end;

TRecordTypeData = packed record
  RecSize: integer;
  FinalFieldCount: integer;
  FinalFields: array[0..MaxWord div sizeof(TFinalField)-1] of TFinalField;
  //Eigentlich:
  //FinalFields: array[0..FinalFieldCount-1] of TFinalField;
end;

procedure dumpRecTypeData(p: PTypeData);
var i: integer;
begin
writeln('Size: ', PInteger(p)^);
writeln('Number of fields to finalize: ', PInteger(Integer(p)+4)^);
for i:=1 to PInteger(Integer(p)+4)^ do
 begin
  writeln;
  writeln('Offset: ', PInteger(integer(p)+12)^);
  writeln('PTypeInfo: ', inttohex(PInteger(PPointer(integer(p)+8))^, 8));
  inc(integer(p), 8);
 end;
end;
Es werden also wirklich nur die Felder gespeichert, die finalisiert werden müssen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat