Ответ 1
Решение, описанное ниже, работает для версий вплоть до Delphi Seattle. Вы можете использовать помощник класса, чтобы взломать класс:
Unit1
type
TTest = class
private
procedure Foo;
end;
Unit2
type
TMyTestHelper = class helper for TTest
function GetFooAddress: Pointer;
end;
function TMyTestHelper.GetFooAddress: Pointer;
var
MethodPtr: procedure of object;
begin
MethodPtr := Self.Foo;
Result := TMethod(MethodPtr).Code;
end;
function FooAddress: Pointer;
begin
Result := TTest(nil).GetFooAddress;//don't need to instantiate an object
end;
Передайте возвращаемое значение от FooAddress
к одной из ваших функций исправления, и вы являетесь золотым.
Однако, начиная с Delphi 10.1 Berlin, это больше не работает! Помощники класса больше не могут обращаться к строгим защищенным, строгим частным или частным членам. Эта "функция" была на самом деле ошибкой компилятора, которую Embarcadero теперь зафиксировал в Берлине. Вам не повезло.