Как пропатчить метод в Classes.pas

Мне нужно патчить метод в Classes.pas

(TReader.ReadString - я хочу заставить его использовать указанную кодовую страницу, а не систему по умолчанию).

Если я скопирую Classes.pas в свой проект, мне придется перестраивать весь VCL. Есть ли (простой) способ исправления метода во время выполнения?

2 ответа

Решение

Я нашел VCLFixPatch:

http://andy.jgknet.de/blog/?page_id=288

Я использовал методы из этого, чтобы заменить метод, который я хотел патч во время выполнения.

Изменение стороны реализации Classes.pas не потребует перекомпиляции всего. Delphi выясняет, нужно ли перекомпилировать модуль с помощью алгоритма, который выглядит примерно так:

  • Если DCU найден:
    • Является ли формат DCU устаревшим (старая версия компилятора)? Если это так, нужен источник для перекомпиляции или ошибка времени компиляции.
    • Источник на пути? Если это так, если он новее, чем DCU, перекомпилируйте
    • Для каждого используемого блока:
      • Повторите анализ при загрузке
      • Для каждого используемого символа ("импорт": тип, переменная, подпрограмма, инициализированная константа и т. Д.) Из этой единицы:
        • Отличается ли версия символа импорта от символа, найденного в использованной единице? Если это так, перекомпилировать нужно.
  • Если DCU не найден, источник должен быть найден и скомпилирован, в противном случае ошибка времени компиляции

Важной концепцией является символьная версия. При сохранении DCU Delphi вычисляет хэш на основе объявления интерфейса символа и связывает его с символом. Другие юниты, которые используют символ, также хранят версию символа. Таким образом, избегаются конфликты времени соединения, вызванные устаревшими символами, в отличие от большинства C-линкеров.

Результатом этого является то, что вы должны иметь возможность добавлять Classes.pas в ваш проект и изменять его раздел реализации почти так, как вам хочется, и при этом иметь возможность статически связываться с остальными библиотеками RTL и VCL и сторонними библиотеками, даже те, которые предоставляются только в объектном формате.

Вещи, чтобы быть осторожным:

  • Встроенные процедуры; тело встроенных подпрограмм является частью версии символа
  • Дженерики; сторона реализации универсальных типов и методов является частью соответствующих версий символов
Другие вопросы по тегам