Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup XDELTA Patch Maker

Автор: brduakh
Дата сообщения: 20.05.2015 20:49
usermode
хотелось бы, пропатчивать hosts, точнее добавлять запись в файл, но без смены атрибутов
Автор: usermode
Дата сообщения: 20.05.2015 22:09
brduakh
leonidz
это все реализуемо посредством кода - по нему объяснять особо не буду.

чтобы выполнить патч в разные директории нужно делать дополнительные silent патчи, которые запускать нужно после основного пропатчивания, в секции After Patching. В данном билде код в silent патче разместить нельзя, это баг о котором говорилось выше.
1. Запускается основной патч.
2. Он запускает тихий, который патчит по другому пути, указанному в командной строке.
3. Если это еще не все, первый тихий отрабатывает и запускает второй тихий и т.п.
для этого в зависимости от размещения external files, нужно указывать код inno или batch кому как удобнее.

примерно для Inno
var res:Integer;

Exec(ExpandConstant('{tmp}\ExternalFiles\SilentPatch1.exe'), '/MY_PARAM="ExpandConstant('{sys}')"', ExpandConstant('{tmp}\ExternalFiles'), SW_HIDE, ewWaitUntilTerminated, res);


хост также патчится кодом Inno, увы и ах, нужно подучить паскаль самостоятельно, например:
SaveStringToFile(ExpandConstant('{sys}')+'\drivers\etc\host', #13 + 'требуемая строка', True);

поэтому раздел с кодом и реализован, чтобы самостоятельно дополнить функционал.
Автор: leonidz
Дата сообщения: 21.05.2015 00:08
Для обычного юзера, такого как я, это очень уж проблематично.
Автор: usermode
Дата сообщения: 21.05.2015 01:15
leonidz
Цитата:
Для обычного юзера, такого как я, это очень уж проблематично.
ну что поделать, эти действия вполне можно реализовать из кода, да, может это и не совсем удобно, но выносить почти все действия Inno в GUI я тоже не могу. Если нужно что-то сделать дополнительно, то можно помочь в реализации. Конечно, что-то навороченное не получится, но простые дополнительные действия и проверки - вполне.
Автор: usermode
Дата сообщения: 22.05.2015 16:54
[no][Release 1.9]

- Fixed bug with using external files and custom code in silent mode.
- Fixed bug with stopping music file if on it playing the skin file has been selected.
- Fixed playing MOD files parameters.
- Changed default settings.
- Changed language files.
- Patch skin preview GUI is changed to used patch template.
- Removed propertie ReadOnly from paths for add it also manually.
- Added [O] button for dir opening and [B] button for files and dirs browsing.
- Added additional freeware patching engine JojoDiff - this engine in some cases generate much smaller diff files then xdelta. Now your can choose default engine JojoDiff or XDELTA.
- Patch appling procedure optimization.
- Added option to Patch "Verify hash" - if checked then after file was patched is checked it MD5 hash with required valid MD5 of modified file.
- Minor tweaks, fixed some issues.[/no]
Автор: Xom9I4oK
Дата сообщения: 22.05.2015 19:04
usermode
А можно попросить Вас скинуть рабочий проект(профиль) сайлент патча (во время установки будет лежать рядом или на один уровень выше с ключевым файлом, сам ключевой файл является тем файлом который надо пропатчить) с запакованными внутри внешними данными. Я уже скидывал до этого свой проект и у меня воз и ныне там - не работает (1 раз как-то сработало, но все равно внешние данные не распаковались).
Автор: leonidz
Дата сообщения: 22.05.2015 19:29
Сдеделал два патча при создании первого использовался
движок - jojoDif
Successful compile (2,215 sec).
Patch_jojoDif.exe 1203KB
движок - XDELTA
Successful compile (1,903 sec).
Patch_XDELTA.exe 1446KB
Автор: usermode
Дата сообщения: 22.05.2015 19:35
Xom9I4oK
да, остался "хвост" моего недотестирования. к тому же заметил, что путь с внешними файлами по прежнему неактивен, если загрузить проект с указанным путем к внешним файлам в проект по умолчанию.
Silent патч будет досканально протестирован с работой и извлечением внешних файлов, и обязательно недоработка будет в скором времени устранена.

Совет. Чтобы Silent патч применился в нужной папке, нужно выставить метод Manually и прописать константу: {src}

Вопрос - а как Вы понимаете извлечение External files (чтобы мне пояснить)? Они предназначены не для извлечения в папку, а для доступа к ним со стороны кода, доступ может быть из временной папки патча, либо прямой доступ из папки вместе с патчем. External files - не могут сами себя куда то скопировать - это нужно делать с помощью кода.

Xom9I4oK
вот, попробуйте, так ли:
(fix for silent in 1.9)
http://rghost.ru/7NzsfqT2j

данный файл скопировать в папку pdata и заменить оригинал.
Автор: Xom9I4oK
Дата сообщения: 22.05.2015 20:20
usermode
Благодарю за разъяснения - просто сначала мануал не нашел, тк слишком много папок и я, как говорится, "забудился в 3х соснах", а в самой программе вроде как тоже нельзя справку открыть. Я думал, что внешние файлы копируются автоматически. А нельзя ли сделать такую возможность, чтобы эта папка по умолчанию копировалась по адресу ключевого файла? А то вроде средствами Inno без подключения SHFileOperation.iss нельзя (без особых заморочек) скопировать всю папку.
Автор: usermode
Дата сообщения: 22.05.2015 20:37
Xom9I4oK
Цитата:
А нельзя ли сделать такую возможность, чтобы эта папка по умолчанию копировалась по адресу ключевого файла?
Сделать то можно, хотелось бы понять смысл. Ведь если добавляемые или внешние файлы разместить в папке Modified files, то они будут записаны вместе с патч-данными и будут копироваться автоматически как обновленные. Сравнивать для патча можно каталоги со всеми файлами, программа сама определит, какие файлы модифицированы для генерации патч-данных, и какие файлы новые - и она их просто добавит целиком.

Как-нибудь я составлю небольшой FAQ по таким вопросам, с примерами кода для Insert Custom Actions.
Для копирования папки с внешними файлами необязательно заморачиваться с подключением SHFileOperation.iss, есть простой код в одну строчку:

копирование внешних файлов (если они были помещены внутрь патча), например, в документы пользователя в папку My Game\Config на любом из шагов Insert Custom Actions (Inno):
в поле Vars:
var ResultCode: Integer;
в шаг:
Exec(ExpandConstant('{sys}') + '\xcopy.exe', '"'+ExpandConstant('{tmp}') + '\ExternalFiles'+'" "'+ExpandConstant('{userdocs}') + '\My Game\Config'+'" /s /e /r /h /y /i', ExpandConstant('{tmp}') + '\ExternalFiles', SW_HIDE, ewWaitUntilTerminated, ResultCode);

//
или можно сделать такое, предлагать копировать дополнительный контент после обновления в папку с установленным обновлением:
в поле Vars:
var ResultCode: Integer;

в шаг AfterPatching:
if MsgBox('Хотите установить мод MyMod для обновленной версии игры?', mbInformation, mb_yesno) = idyes then
begin
if Exec(ExpandConstant('{sys}') + '\xcopy.exe', '"'+ExpandConstant('{tmp}') + '\ExternalFiles'+'" "'+ResultStr+'" /s /e /r /h /y /i', ExpandConstant('{tmp}') + '\ExternalFiles', SW_HIDE, ewWaitUntilTerminated, ResultCode) then
begin
MsgBox('MyMod установлен!', mbInformation, mb_ok);
end else
begin
MsgBox('Произошла ошибка при запуске утилиты копирования! MyMod не установлен!', mbError, mb_ok);
end;
end;

наверное, есть смысл сделать константу Error: равна 0 - когда ошибок нет, и 1 - когда процесс обновления завершился неудачно.
тогда можно будет манипулировать дополнительным кодом еще гибче, к примеру:
if Error = 0 then
begin
// выполняем действия, если успех
end;
if Error = 1 then
begin
// выполняем действия, если неуспех или ничего не выполняем
end;
Автор: Xom9I4oK
Дата сообщения: 22.05.2015 21:08
usermode
Спасибо за код и правленный файлик - как раз то что надо.
А есть возможность, чтобы патч был сайлент, но отображался прогресс-бар, т.е. чтобы он был не /VERYSILENT, а просто /SILENT?
Автор: usermode
Дата сообщения: 22.05.2015 21:13
Xom9I4oK
Цитата:
А есть возможность, чтобы патч был сайлент, но отображался прогресс-бар?

для этого нужно сделать шаблон, давайте обсудим, что должен "почти тихий" патч отображать на экране, делать ли его со свойством "Всегда сверху", указывать заголовок с текстом и т.д. - по делу. Я так понимаю, он должен запускаться без каких-либо кнопок и чекбоксов и просто отображать информацию? Например:
"Заголовок окна" + Информация о выполнении, допустим "Updating files... Please wait..." + Информация о пути, допустим "Patching in: %path%" + Прогресс бар.

ну а хелпы размещу вместе с exe в следующем билде таки.
Автор: Xom9I4oK
Дата сообщения: 22.05.2015 21:32
Да, "он должен запускаться без каких-либо кнопок и чекбоксов и просто отображать информацию". Насчет Всегда сверху" думаю лучше без этого, тк на всех современных Windows прогресс установки можно посмотреть и на панели задач. Заголовок, думаю, стоит оставить стандартный, как и в обычной не сайлент версии.

Цитата:
"Заголовок окна" + Информация о выполнении, допустим "Updating files... Please wait..." + Информация о пути, допустим "Patching in: %path%" + Прогресс бар.
Да, то что нужно.
Автор: usermode
Дата сообщения: 22.05.2015 22:02
Согласен на счет "Always on top", к тому же фича многих раздражает.

Цитата:
на всех современных Windows прогресс установки можно посмотреть и на панели задач.
в патчах это не реализовано, но сделаю. И мигание иконки в таскбаре при завершении.
Автор: usermode
Дата сообщения: 24.05.2015 18:30
[Release 1.9.1]

- Fixed bug with disabled state of External files path in form if project with specified External dir was loaded.
- Fixed bug with extracting or direct access to external files in silent mode.
- Fixed bug with enabling "Verify hash" option if patch builded not in a silent mode and default state option was not checked.
- Fixed some issues in help_en.chm.
- Added animated progress bar to taskbar icon in Patch and Patch Maker.
- Added flash effect to taskbar icon to Patch if patching was finished.
- Added integer constant "PatchingError" for using in Inno Custom Code in steps "AfterPatching" and "OnFinish". "PatchingError" return 1 if some error ocurred or 0 if patching successfull. For example use in required step: if PatchingError = 0 then begin MsgBox('Some code after successfull patching here!', mbInformation, mb_OK); end;
- Minor tweaks, fixed some issues.

ссылка пока здесь, на SoftPedia будет позже:
http://rghost.ru/private/8Pvwsd7nW/1b2257bda03bb8013ebae1b7d625a5fd

Форма для тихого патча пока окончательно не протестирована, фича будет доступна в следующем билде.
Выглядит пока так:
Автор: Xom9I4oK
Дата сообщения: 24.05.2015 19:21
usermode
А у Вас так задумано, что иконка на панели задач мигает пока не закроешь (просто обычно делают так, чтобы достаточно раз на неё нажать и она перестает мигать).
По поводу "Формы для тихого патча" - а если процесс установки пройдет без ошибок, то диалоговое окно в конце будет показываться или нет? Если будет, то можно опционально сделать так, чтобы в конце форма сразу закрывалась без таймера или чтобы самому можно было выставить 0 сек время закрытия окна?
Автор: usermode
Дата сообщения: 24.05.2015 19:42
Xom9I4oK
Цитата:
так задумано, что иконка на панели задач мигает пока не закроешь
вообще-то да, т.е. уведомляет о том, что патч завершен. Ну а с другой стороны - зачем кликать по нему , чтобы остановить мигание? Уже закрывать окно надо, а не наслаждаться Но это имхо, я не знаю как лучше сделать, т.е. не вижу смысла особого при клике останавливать таймер мигания уже завершившегося патча.

Цитата:
а если процесс установки пройдет без ошибок, то диалоговое окно в конце будет показываться или нет?
точно такое же, только с другими уведомлениями. по умолчанию идет отсчет 5 секунд и форма закрывается сама, но ее можно после завершения операций закрыть досрочно. мне показалось, что делать небольшую задержку в секундах полезно для пользователя, во первых он увидит мигание иконки и переключится на окно, а там увидит сообщения: "патч успешно применен", "нечего патчить" и "патч завершен с ошибками и применился откат". устанавливать количество секунд вручную можно сделать, если это так необходимо.

еще можно сделать так, чтобы после патча его окно переключалось как на основное (у того патча что SilentForm).

все таки сделаю прекращение мигания после того, как форма патча станет активной.

добавлено
вобщем делаю мигание так: если форма неактивна (перекрыта другими приложениями), то иконка по завершении мигает. как только пользователь активировал окно патча или кликнул по это иконке для появления патча, то тут же иконка мигать перестает.
решено не делать приоритетным окно патча после завершения, т.к. это тоже почти раздражающий эффект AlwaysOnTop, нужно не мешать пользователю работать со своими приложениями на момент обновления, я так считаю.

для SilentForm делаю так, считаю так лучше, если форма активна, то появляется информация об выполнении и идет отсчет секунд до закрытия сразу. если форма была неактивна, то начинает мигать иконка и только после того, как пользователь активирует форму, начинает идти отсчет секунд до закрытия. если выставить значение секунд 0 в настройках, то форма будет закрыта досрочно без каких либо миганий и уведомлений.

также планируется сделать опции для облегчения: "копировать External Files в папку с установкой" и "копировать External Files в выборочную папку", для которой нужно будет в качестве корня указать константу Inno, например, "{userdocs}\My Games\Updated Settings". если понадобится получать кастомный путь через реестр, к примеру, то тогда нужно будет манипулировать этой функцией вручную из кодовой вставки.
Автор: usermode
Дата сообщения: 26.05.2015 12:04
[Release 1.9.5]

- Improved path detection - now if key-file was not found in any detection path then message "Path not found!" will be appear. For manually method key-file checking is disabled.
- Renamed "Enable silent patch mode option" to "Silent" and "Enable force patch mode option" to "Force", this options moved to "PatchMode".
- Added feature "SilentForm" to "PatchMode". The feature add to silent patch form with progress bar and some messages - it closed automatically after some specified seconds after all operations was completed.
- Fixed flash effect for taskbar icon. Now if form is activated then flashing is stop.
- Fixed bug with language file extraction before patch initialization.
- Added Feature "Copy external files to:" "InstallDir" or "CustomDir" with custom dir name. This option have effect only on successfull patching (PatchingError = 0) and will be performed only after patching step. If You want to get custom dir from the registry, then You must disable copy options and paste advanced Inno Setup or Batch script code to Insert Custom Actions for this operation.
- Added Dutch translation (tnx to Gerard).
- Minor tweaks, fixed some issues.

Ссылка обновлена.
Автор: Xom9I4oK
Дата сообщения: 26.05.2015 19:08
usermode
Спасибо за SilentForm - то что надо. Теперь возник вопрос по батникам - почему-то не могу заставить заработать. Пишу код на удаление файла del /q /s !.txt предварительно выставив Batch script и Before patching и не срабатывает. Пробовал подложить файл !.txt рядом с патчем и рядом с ключевым файлом - ноль эффекта. В чем может быть проблема?
Автор: usermode
Дата сообщения: 26.05.2015 19:59
Xom9I4oK
батники выполняются либо в папке с External Files, если они указаны, либо по дефолту из временной директории.

Пока посоветую использовать код Inno в шаг Before patching:

DeleteFile(ResultStr + '\!.txt');

Я правильно понимаю, нужно реализовать возможность манипулировать батниками из директории с обновляемой программой?

Автор: Xom9I4oK
Дата сообщения: 26.05.2015 20:01
usermode

Цитата:
Я правильно понимаю, нужно реализовать возможность манипулировать батниками из директории с обновляемой программой?

Да, правильно - я если честно изначально думал, что оно изначально так и работает.
P.S. Спасибо за совет.
Автор: usermode
Дата сообщения: 26.05.2015 20:13
Xom9I4oK
Опцию выполнения Batch кода из директории с обновляемой программой в соответствующих шагах реализую в следующем билде.
Автор: usermode
Дата сообщения: 28.05.2015 15:16
[Release 1.9.6]

- Fixed bug with extracting batch-files if External files extracted to the temporary dir.
- Fixed bug with extracting batch-files if Patch run not in a Silent mode.
- Added feature for Batch Script "Execute from InstallDir". The option is available for steps "Before Patching" and "After Patching" only.
- Added to constant "PatchingError" value 2 for Inno Script. This value is mean that "PatchingError" was not performed, it can be used in "Insert Custom Actions" in "On Finish" step if user run patch and close it down without patching process, f.e.: if PatchingError = 2 then begin MsgBox('Patch was not applied! All changes have effect only after patching!', mbInformation, mb_OK); end; For other steps value 2 is not actually.
- Added to PatchOutput button [R] for run compiled patch with specified name from Patch Maker.
- Minor tweaks, fixed some issues.
Автор: Xom9I4oK
Дата сообщения: 30.05.2015 19:22
usermode
У меня появились новые вопросы по программе (я использую SilentForm, бекап в настройках выключен):
Если патч большой (патчится много файлов большого размера), то во время бекапа файлов (я имею ввиду тот, который перед патчингом файлов происходит) на форме это никак не отображено (допустим, "подождите идет резервное копирование") и остается видимым только заголовок патчера, а остальная часть окна становится серой (подвисает). Далее, если идет откат изменений (если была включена проверка хэша и какой-то файл не смог пропатчится, или смог, но контрольная сумма не совпадает, тк исходный файл был не тот что надо - модифицирован), то поведение практически аналогично бэкапу, только форма не "сереет" (и нет надписи типа "идет откат изменений"). И еще - я включал лог, чтобы понять на каком файле стопорится патчер, но так и не смог этот лог-файл найти.
Автор: usermode
Дата сообщения: 30.05.2015 21:03
Xom9I4oK
в Silent режиме бэкап и лог не предусмотрен (на то они и тихие), но для отката копии файлов в резервной папке создаются.

по поводу больших файлов: подвисать будет по-любому при подсчете md5 и ожидании резервного копирования - тут патчер как бы не причем. так что нужно сделать - дополнительные уведомления в окне SilentForm патча или еще какие пожелания будут?

рекомендуется не делать патч-файлы для сжатых архивов, например, если файлы по 4 гигабайта и патч-файл выходит тоже 4 гб. в таком случае лучше поместить их в External Files рядом с патчем и скопировать оттуда.
Автор: Xom9I4oK
Дата сообщения: 30.05.2015 21:33
usermode
Да, уведомлений будет достаточно. Хотя в идеале, конечно, хотелось бы прогресс бар для бэкапа и отката изменений в случае неудачи.
У меня тут еще одно пожелание возникло. Программа кэширует патч-файлы, но я не заметил, чтобы это как-то влияло на скорость создания патча повторно. Мне эта ф-ция еще в Visual Patch'е приглянулась. Так что хотелось бы, чтобы при вкл. соотв. опции прога брала патч-файлы из кэша (он будет очищаться, если та опция будет выключена).
Автор: usermode
Дата сообщения: 30.05.2015 22:11
Xom9I4oK

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

патчинг и бэкап делаются в цикле "поштучно", а не сразу сначала делается бэкап, а потом патчинг. Поэтому для бэкапа и патчинга прогресс бар общий. Для отката можно сделать также индикацию, но не в виде второго прогресс бара, а делать обнуление текущего, т.е. как в Inno - с последней отметки до нулевой. Насчет кэширования - тогда надо делать сохранение патч-файлов в папке xdata в отдельных папках с соответствием имени и версии программы проекта, и тут тоже еще придется поразмыслить, нужно будет тогда еще резервировать под каждый проект свой Checker.ini с листингом файлов и md5 - в целом опцию одобряю, постараюсь реализовать. Еще сделаю опцию "Show batch window" - а то есть такие сценарии, которые могут потребовать от пользователя ввода или подтверждения данных для выполнения определенных действий.
Автор: Xom9I4oK
Дата сообщения: 31.05.2015 22:46
usermode

Цитата:
патчинг и бэкап делаются в цикле "поштучно", а не сразу сначала делается бэкап, а потом патчинг.

Ясно, а как тогда объяснить что SilentForm патч (сам патч 377Мб, патчатся 259 файлов размером менее 100Мб каждый) в самом начале "подтупливает/подвисает" (проверял на 2х разных компах, на одном из них стоял SSD-диск) минуту или даже дольше?
И еще не понятно (даже по логу) почему патч (в этот раз делал на движке xdelta, даже подозрительно, что он меньше получился чем JoJodiff) стопорится. Я патчу ту же папку на основе которой делал патч...

Код:
Целевой файл: C:\!BioShock 2\SP\Content\Sounds_Windows\LocalizedPrefixMap.pmp
Файл патч-данных: C:\Users\Serg\AppData\Local\Temp\is-GTEE7.tmp\PatchData\SP\Content\Sounds_Windows\LocalizedPrefixMap.pmp.xdelta
Обновленный: C:\!BioShock 2\SP\Content\Sounds_Windows\LocalizedPrefixMap.pmp
Правильный MD5 хэш для обновленного файла: C:\!BioShock 2\SP\Content\Sounds_Windows\LocalizedPrefixMap.pmp
Всего обработано файлов: 84
[Завершение сессии обновления]
Откат начался!
Автор: usermode
Дата сообщения: 31.05.2015 23:17
Xom9I4oK
Цитата:
в самом начале "подтупливает/подвисает"
в самом начале "подтупливание" может быть обусловлено извлечением патч-файлов во временную директорию. Тоже самое наблюдается при сборке патча без включенной опции "Inside patch"?
"Подтупливает" только SilentForm или при таких же опциях и основной шаблон?
Автор: Xom9I4oK
Дата сообщения: 01.06.2015 15:35

Цитата:
"Подтупливает" только SilentForm или при таких же опциях и основной шаблон?

Основной тоже тупит. Без "Inside patch" оба режима не тупят. С External files тоже не все так гладко - с выключенным Include files into the patch патч не проходит компиляцию.
P.S. + я выше писал что с включенным Verify hash скомпиленный патч не доходит до конца и стопорится под конец пропатчивания.

Страницы: 123456

Предыдущая тема: Offtop


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.