Добрый всем вечер.Пользуюсь Patch Makerом для русификации программ Вот задумался как работает патчер файлов.Понятно что сравниваются два файла новый и старый.А вот где сравниваются?Как?и как заменяются?На хиасме даже не знаю с какой стороны начать.Может кто чем поможет для начала.
Этот топик читают: Гость
Ответов: 287
Рейтинг: 5
|
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Вариантов вижу 2.
Первый самый простой - файлы сравниваются во время создания патчера. Затем все остальные разы патчер просто берет конечный файл и заменяет указанные значения в указанных местах файла. Тогда он должен проверить что конечный файл является в точности тем, для которого патчер создавался (например по контрольной сумме). Иначе если файл отличается, то применение патчера нарушит его структуру. Второй - в файле ищутся фрагменты, которые, надо заменить или перед/после которых надо вставить новые данные. Тогда конечный файл может немного отличаться от оригинального (например, новая версия), но это все равно чревато нарушениями работы пропатченого файла. |
|||
карма: 26 |
|
Ответов: 287
Рейтинг: 5
|
|||
В случае с русификацией,конечный файл увеличивается и файл работает.Если менять ресурсы и картинки.Смысл как он их сравнивает и заменяет
|
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Ресурсы в файле имеют имена. Ресурсы можно заменять, не нарушая работы файла. Тогда патчер только заменяет ресурсы. Файл может иметь другую версию.
Вопрос в том заменяет ли он ресурс полностью, либо выполняет какое-то слияние. Например, в окне новой версии файла была добавлена кнопка, то при замене ресурса окна на старый она пропадет. А чтобы этого не произошло - патчеру надо знать какие ресурсы отвечают за окно и выполнять умное слияние. Со строками в ресурсах проще - они заменяются целиком, новые строки просто не затрагиваются (если в новой версии все строки не были перенумерованы). |
|||
карма: 26 |
|
Ответов: 287
Рейтинг: 5
|
|||
Мне все же кается что замена идет по номерам строк.Так проще.Значит нужно перебрать строки в старом и новом файле и как то зафиксировать изменения
|
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Строки в ресурсах - да, по номерам. Но есть ресурсы, в которых содержится описание окон (интерфейса) программы, например, тип ресурса "RCData" или "Dialog". Их можно заменять целиком, либо пытаться выполнить слияние.
Но ресурсы нельзя заменить простой заменой, если размер оригинального и нового не совпадают. Нужно подвинуть последующие ресурсы и переписать их размеры-расположение в соответствующих местах исполняемого файла. Редактировалось 1 раз(а), последний 2021-10-11 18:03:45 |
|||
карма: 26 |
|
Ответов: 287
Рейтинг: 5
|
|||
Чет я совсем запутался.Не могу EXE открыть
|
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
У компонента StreamConvertor включи верхнюю точку Data и соедини её с точкой Stream компонента FileStream.
Событие onLoad ничего не выдаёт в поток (а описание точки стоило бы поправить). |
|||
карма: 26 |
|
Ответов: 287
Рейтинг: 5
|
|||
Я так делал.Небольшие екзешники открывает.А если 3-4 мб то виснет
|
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Ну и зачем тогда выложил поломанную схему и сказал что "не могу EXE открыть"?
В Memo по умолчанию буфер 32 Кб. Данные в HEX-представлении занимают в два раза больше исходных. Не выводи в Memo - не будет виснуть. Чтение/запись данных в файл происходит с помощью компонента DataToFileEx. Редактировалось 1 раз(а), последний 2021-10-12 15:34:16 |
|||
карма: 26 |
|
Ответов: 287
Рейтинг: 5
|
|||
С поиском и заменой худо бедно разобрался.
Редактировалось 1 раз(а), последний 2021-10-13 12:49:47 |
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Реализовать алгоритм поиска и сравнения. Файлы читать в память как текст и работать как с текстом, либо работать как с потоками с помощью DataToFileEx.
Алгоритм прикинуть на бумаге/в голове, потом подумать как реализовать. Читаешь фрагмент исходного файла определенной длины, затем в цикле читаешь из другого файла фрагмент такой же длины и сравниваешь. На следующей итерации цикла возвращаешь позицию чтения другого файла на следующий байт, с которого читал предыдущий фрагмент и опять сравниваешь. Типа: 1) Прочитал строку длиной 5 символов из позиции 0 первого файла 2) Прочитал строку длиной 5 символов из позиции 0 второго файла 3) Сравнил 4) Вернул позицию во втором файла в номер 1 (на второй байт, "предыдущая позиция + 1") Пункты 2-4 выполняются в цикле, пока весь второй файл не будет прочитан Пункты 1-4 выполняются в цикле, пока весь первый файл не будет прочитан Можно читать и сравнивать по 1 байту, если размеры файлов одинаковые. Если размеры разные и в файлах были добавления-перемещения фрагментов - надо думать как это должно работать. Для записи новых данных в файл - с помощью модицированного DataToFile (оригинальный не умеет писать в файл строку без дополнительных окончаний). Также можно использовать для чтения указанного количества байт (стандартный не умеет). Редактировалось 2 раз(а), последний 2021-10-13 13:59:34 |
|||
карма: 26 |
|
Ответов: 287
Рейтинг: 5
|
|||
С циклом понятно,разберусь.Получается оба файла нужно читать одновременно?И не могу понять как сделать сравнение.А почему 5 а не 4 или больше символов?
|
|||
карма: 0 |
|
Ответов: 4628
Рейтинг: 749
|
|||
Нужно сформулировать задачу, а затем придумать алгоритм сравнения. Для двоичных файлов это не такая простая задача, поэтому программ для сравнения текстовых файлов есть много, а двоичных - не очень и не всегда они подходят. Да и сравнение текстовых файлов на HiAsm, вероятно, достаточно сложная задача.
Например, можно сравнивать по одному байту и просто выдавать адреса отличающихся байт. Но это не будет работать, если в файле была вставка данных. Пример: - исходный файл: 123456789 - новый файл: 123356789 Отличается 1 байт в позиции 4 - исходный файл: 123456789 - новый файл: 1233456789 Что здесь произошло? Отличаются 6 байтов, начиная с позиции 4 и добавлен 1 байт в конце (1233456789) или добавлен 1 байт в позицию 4, а остальные сдвинулись вперед (1233456789)? А как это отличить? Редактировалось 2 раз(а), последний 2021-10-13 15:37:39 |
|||
карма: 26 |
|
Ответов: 287
Рейтинг: 5
|
|||
Да-а по моему не видать мне своего патчера
--- Добавлено в 2021-10-13 16:12:39 А почему не так Исходный файл 1234567899876543219800000 Новый файл 1235467899907543219876654 берем по 5 байт 12345 67899 87654 32198 00000 12354 67899 90754 32198 76654 замена------- замена------- замена Редактировалось 6 раз(а), последний 2021-10-13 16:15:17 |
|||
карма: 0 |
|