Как я могу исправить частный метод класса Delphi?
Я прочитал эти вопросы и ответы
Как изменить реализацию (обход) объявленной извне функции
Патч рутинного вызова в Delphi
но я не могу понять, как исправить частный метод класса, расположенного в другом модуле.
Проверьте этот образец, я хочу исправить Bar
процедура.
Unit ThidParty;
Interface
Type
TFoo =Class
private
procedure Bar;
end;
Я думаю, какой ключ найти способ получить адрес частного метода.
Итак, как я могу исправить частный метод класса Delphi?
2 ответа
Изложенное ниже решение работает для версий вплоть до Delphi Seattle. Вы можете использовать помощник класса, чтобы взломать класс:
Раздел 1
type
TTest = class
private
procedure Foo;
end;
Модуль 2
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 теперь исправила в Берлине. Вам не повезло.
Просто переопределите метод, используя перехват класса, он работает до версии Rad 10.4.