Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: schreibender Zugriff auf private Variablen ?

  Alt 6. Nov 2007, 16:52
@Phoenix: Da steht aber nur der Zeiger. Das wird recht kompliziert.

Erweiterte Möglichkeit zu Phoenix:
Variable ist "String", also dynamisch. Damit muss sie definitv in der RTTI auftauchen.

Die RTTI zum Datenrecord einer Klasse findest du so
Delphi-Quellcode:
var inittable:^pointer;
begin
  inittable:=pointer(integer(self.classparent)+vmtinittable); //oder noch mehr classparent's; je nachdem wo man hinwill
  //oder nicht im Parent, dann pointer(integer(ppointer(self)^)+vmtinittable);
                          //bzw. pointer(integer(mytest.classInfo)+vmtinittable);

  if inittable<> nil then
    inittable:=inittable^
  else
    //diese Klasse hat (in der Generation) keine dynamischen Komponenten
Dort (bei inittable) dürftest du erstmal ein $0E für Record finden, dann einen Shortstring der nur aus dem Längenbyte besteht (indem 0 drinn steht), und dann kommt folgender Datenkonstrukt
Delphi-Quellcode:
//RTTI eines Records
type PPropContent=^TPropContent;
     TPropContent=record
       RecordData:pointer; //RTTI einer dynamischen Variablen innerhalb des Records
       Position:LongInt; //Position der Variablen im Record
     end;
type PRecordData=^TRecordData;
     TRecordData=record
       ParamCount:cardinal; //Größe des Records insgesamt
       PropCount:cardinal; //Anzahl der dynamischen Komponenten
       Content:array[0..16737] of TPropContent;
end;
Dich interessiert davon das Array Content[0..Propcount-1]. Und in jedem Element des Arrays hlst du dir RecordData. Das ist ein Zeiger auf einen Zeiger auf die RTTI der dynamischen Komponente aus deiner Klasse. Und wenn dort das erste Byte $0A ist, dann ist die dynamische Komponente ein String (Du kannst auch mit den Konstanten aus der TypeInfo arbeiten tkString=10).
Jetzt weist du dass diese dynamische Komponente ein String ist und du nimmst dir Position, addierst den Wert zu self und hast deinen String.
Und jetzt musst du den Inhalt überprüfen, wie Phoenix sagte.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat