I need to access a strict protected property, because I need to create a validation (based in the value of this property) to avoid a bug. (I don't have the source code of the third party class which has this property) only I have the definition of the class (interface) and the dcu (so I can't change the property visibility). The question is Exist a way to access a strict protected property? (I really read the Hallvard Vassbotn Blog, but I don't find anthing about this particular topic.)
This class helper example compiles fine :
type
TMyOrgClass = class
strict private
FMyPrivateProp: Integer;
strict protected
property MyProtectedProp: Integer read FMyPrivateProp;
end;
TMyClassHelper = class helper for TMyOrgClass
private
function GetMyProtectedProp: Integer;
public
property MyPublicProp: Integer read GetMyProtectedProp;
end;
function TMyClassHelper.GetMyProtectedProp: Integer;
begin
Result:= Self.FMyPrivateProp; // Access the org class with Self
end;
Some more information about class helpers can be found here : should-class-helpers-be-used-in-developing-new-code
Update
Starting with Delphi 10.1 Berlin, accessing private
or strict private
members with class helpers does not work. It was considered a compiler bug and has been corrected. Accessing protected
or strict protected
members is still allowed with class helpers though.
In the above example access to a private member was illustrated. Below shows a working example with access to a strict protected member.
function TMyClassHelper.GetMyProtectedProp: Integer;
begin
with Self do Result:= MyProtectedProp; // Access strict protected property
end;
You can use a variant of the standard protected
hack.
Unit 1
type
TTest = class
strict private
FProp: Integer;
strict protected
property Prop: Integer read FProp;
end;
Unit 2
type
THackedTest = class(TTest)
strict private
function GetProp: Integer;
public
property Prop: Integer read GetProp;
end;
function THackedTest.GetProp: Integer;
begin
Result := inherited Prop;
end;
Unit 3
var
T: TTest;
....
THackedTest(T).Prop;
Strict protected only allows you to access the member from the defining class, and subclasses. So you have to actually implement a method on the cracking class, make it public, and use that method as the route into the target strict protected member.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With