Wie kann man von einem Klassenhelfer in Delphi 10.1 Berlin auf ein privates Feld zugreifen?

8

Ich würde gerne Gabriel Corneanus jpegex , einen Klassenhelfer für jpeg.TJPEGImage. Lesen dies und dies Ich habe gelernt, dass man außerhalb von Delphi Seattle nicht mehr auf private Felder wie jpegex zugreifen kann (FData im Beispiel unten). Mit der VMT herumzuspielen, wie es David Heffernan vorgeschlagen hat, liegt weit über mir. Gibt es einen einfacheren Weg, dies zu tun?

%Vor%     
stackmik 20.05.2016, 16:11
quelle

3 Antworten

11

Vorsicht! Dies ist ein hässlicher Hack und kann fehlschlagen, wenn sich die interne Feldstruktur der gehackten Klasse ändert.

%Vor%

Dies funktioniert nur, wenn die Elternklasse der Klasse "hack" dieselbe ist wie die Elternklasse der ursprünglichen Klasse. In diesem Fall erbt TJPEGData von TSharedImage und damit auch die Klasse "hack". Die Positionen müssen auch übereinstimmen, wenn also ein Feld vor FData in der Liste war, dann sollte ein äquivalentes Feld in der Klasse "hack" stehen, auch wenn es nicht verwendet wird.

Eine vollständige Beschreibung der Funktionsweise finden Sie hier:

Hack # 5: Zugriff auf private Felder

    
Uwe Raabe 20.05.2016, 16:36
quelle
11

Heute habe ich mit der with-Anweisung einen ordentlichen Weg um diesen Fehler gefunden.

%Vor%

Außerdem hat Embarcadero einen schönen Job gemacht, Wände zu bauen, um die privaten Teile zu schützen, und das ist wahrscheinlich der Grund, warum sie ihn als 10.1 Berlin bezeichneten.

    
Toon Krijthe 21.03.2017 19:47
quelle
4

Durch die Verwendung einer Kombination aus einem Klassenhelfer und RTTI ist es möglich, mit Hilfe von Klassenhelfern die gleiche Leistung wie in früheren Delphi-Versionen zu erreichen.

Der Trick besteht darin, den Offset des privaten Feldes beim Start mit RTTI aufzulösen und das innerhalb des Helpers als class var zu speichern.

%Vor%

Wie Sie sehen können, erfordert es ein wenig zusätzliche Eingabe, aber verglichen mit dem Patchen einer ganzen Einheit ist es einfach genug.

    
LU RD 16.06.2016 14:26
quelle