Как я могу исправить частный метод класса 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.

Другие вопросы по тегам