Как пропатчить метод в 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 и сторонними библиотеками, даже те, которые предоставляются только в объектном формате.
Вещи, чтобы быть осторожным:
- Встроенные процедуры; тело встроенных подпрограмм является частью версии символа
- Дженерики; сторона реализации универсальных типов и методов является частью соответствующих версий символов