Подтвердить что ты не робот

Как я могу исправить частный метод класса delphi?

Я прочитал эти вопросы и ответы

Как изменить реализацию (обход) внешне объявленной функции

Патч рутинный вызов в delphi

но я не могу понять, как патч частный метод класса, расположенного в отдельном модуле.

Проверьте этот образец, я хочу исправить процедуру Bar.

Unit ThidParty;
Interface
   Type
      TFoo =Class
        private
           procedure Bar;
       end;

Я думаю, что ключ найдет способ получить адрес частного метода.

Итак, как я могу исправить приватный метод класса delphi?

4b9b3361

Ответ 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 теперь зафиксировал в Берлине. Вам не повезло.