Делаем патч в Inno как на PatchWise Free…
Делаем патч в Inno как на PatchWise Free…От меня: я не создаю скрипты для Inno,
-
Скрипт с данной темы форума PеееatchSetup.rar
мне бы приделать: сheckbox для бекапа и messagebox при успешном пропатчивании файла, например "Программа успешно русифицирована!"
-и было бы совсем идеально!8 апреля 2012 - 14:26 / #21 -
Metabolic, Вот, смотри:
var
NewCheckBox1: TNewCheckBox;
const
BackupDir = 'PatchBackup';
PatchFile = 'MyPatch.dat';
function vpatch(parentwnd: Integer; pluginname, funcname, param1, param2, param3: PChar): Integer;
external 'vpatch@files:callvpatch.dll stdcall';
function PatchFileFunc(FileName: string): Integer;
begin
Result NewCheckBox1 := TNewCheckBox.Create(WizardForm);
with NewCheckBox1 do
begin
Parent := WizardForm.ReadyPage;
SetBounds(ScaleX(8), ScaleY(24), ScaleX(97), ScaleY(17));
Caption := 'NewCheckBox';
end;
end;
// Проверка присутствия определенных файлов в папке с установленной программой на странице выбора папки назначения
function NextButtonClick(CurPage:= ScaleY(0);
NewCheckBox1 := TNewCheckBox.Create(WizardForm);
with NewCheckBox1 do
begin
Parent := WizardForm.ReadyPage;
SetBounds(ScaleX(8), ScaleY(24), ScaleX(97), ScaleY(17));
Caption := 'NewCheckBox';
end;
end;
// Проверка присутствия определенных файлов в папке с установленной программой на странице выбора папки назначения
function NextButtonClick(CurPage: Integer): Boolean;
var
s: string;
begin
Result if not (MD5 = '9711713d2e4173cccfeeea1ffd76f129')
//Вставьте полное имя файла выше и MD5 с енг буквами В НИЖНЕМ РЕГИСТРЕ!
then
begin
s := 'Ошибка MD5 в файле обновления!' #13#13 'Установка прекращена.';
MsgBox(s, mbCriticalError, mb_Ok); //Если хеш файла(ов) не соответствует, выдается сообщение, и на этом все действия прекращаются.
WizardForm.Close; //Закрытие инсталлятора
Exit; //Прерывание и откат всех действий
end;
end;
end;
//Не забываем дописать еще такую процедуру
procedure CancelButtonClick(CurPage:= GetMD5OfFile(ExpandConstant('{app}wylek.exe'));
if not (MD5 = '9711713d2e4173cccfeeea1ffd76f129')
//Вставьте полное имя файла выше и MD5 с енг буквами В НИЖНЕМ РЕГИСТРЕ!
then
begin
s := 'Ошибка MD5 в файле обновления!' #13#13 'Установка прекращена.';
MsgBox(s, mbCriticalError, mb_Ok); //Если хеш файла(ов) не соответствует, выдается сообщение, и на этом все действия прекращаются.
WizardForm.Close; //Закрытие инсталлятора
Exit; //Прерывание и откат всех действий
end;
end;
end;
//Не забываем дописать еще такую процедуру
procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
Cancelbegin
if CurStep = ssInstall then
begin
err := False; // ошибки пока еще нет
CreateDir(ExpandConstant('{app}' + BackupDir));
if NewCheckBox1.Checked then BackupFile('wylek.exe');// Если стоит галка на чекбоксе то бекапим
case PatchFileFunc('wylek.exe') of
0: Boolean;
begin
if CurStep = ssInstall then
begin
err := False; // ошибки пока еще нет
CreateDir(ExpandConstant('{app}' + BackupDir));
if NewCheckBox1.Checked then BackupFile('wylek.exe');// Если стоит галка на чекбоксе то бекапим
case PatchFileFunc('wylek.exe') of
0: WizardForm.ProgressGauge.Position end;
end;
case err of // проверяем состояние ошибки и выводим соответствующее сообщение
True := True; // если не удалось пропачить, то говорим, что была ошибка
end;
end;
case err of // проверяем состояние ошибки и выводим соответствующее сообщение
True : MsgBox('При русификации произошла ошибка!',mbError,MB_OK);
False: MsgBox('Программа успешно русифицирована!',mbInformation,MB_OK);
end;
end;
end;
//Вставьте полные имена файлов выше на каждую процедуру отдельно
Добавил вывод сообщений о буспешной/неуспешной русификации8 апреля 2012 - 15:38 / #22 -
"Gnom" Спасибо за скрипт - единственное его нужно немного подправить:
сheckbox и messagebox есть, но инсталятор русифицирует только в том случае, если поставить галочку на бэкап, а если не ставить - инсталятор в конце инсталяции просто закрывается но файлы не русифицирует!8 апреля 2012 - 17:06 / #23 -
Metabolic, попраил, чтобы только бекапило по чекбоксу.8 апреля 2012 - 21:17 / #24
-
Gnom попробуй ещё раз поправить:
-с галочкой патчится нормально, а без выдаёт сообщение "При русификации произошла ошибка!"
•и ещё вопрос - можно ли задать произвольную ширину и высоту окна инсталятора? (пробовал изменить в 'редакторе форм' но там получается лиш увеличить, а мне бы уменьшить.)8 апреля 2012 - 22:57 / #25 -
Metabolic, По первому вопросу - покажи свой код - именно свой. по второму:
procedure InitializeWizard();
begin
with WizardForm do
begin
AutoScroll := False;
ClientHeight := ScaleY(100);// высота
ClientWidth := ScaleX(500); // ширина
end;
end;
указываешь нужный тебе размер9 апреля 2012 - 10:05 / #26 -
Код впринципе тот что ты мне поправлял! я только чекбокс перенёс на страницу "Выбор папок установки"
var
NewCheckBox1: TNewCheckBox;
const
BackupDir = 'PatchBackup';
PatchFile = 'MyPatch.dat';
function vpatch(parentwnd: Integer; pluginname, funcname, param1, param2, param3: PChar): Integer;
external 'vpatch@files:callvpatch.dll stdcall';
function PatchFileFunc(FileName: string): Integer;
begin
Result := vpatch(1, ExpandConstant('{tmp}VPatch.dll'), 'vpatchfile', ExpandConstant('{tmp}' + PatchFile), ExpandConstant('{app}' + BackupDir + '' + FileName), ExpandConstant('{app}' + FileName));
end;
procedure BackupFile(FileName: string);
begin
if not FileExists(ExpandConstant('{app}' + BackupDir + '' + Filename)) then
FileCopy(ExpandConstant('{app}' + Filename), ExpandConstant('{app}' + BackupDir + '' + Filename), True);
end;
procedure RestoreFile(FileName: string);
begin
FileCopy(ExpandConstant('{app}' + BackupDir + '' + Filename), ExpandConstant('{app}' + Filename), False);
DeleteFile(ExpandConstant('{app}' + BackupDir + '' + Filename));
end;
procedure InitializeWizard();
begin
ExtractTemporaryFile('VPatch.dll');
ExtractTemporaryFile('MyPatch.dat');
WizardForm.ReadyMemo.Height := ScaleY(0);
NewCheckBox1 := TNewCheckBox.Create(WizardForm);
with NewCheckBox1 do
begin
Parent := WizardForm.SelectDirPage;
SetBounds(ScaleX(8), ScaleY(120), ScaleX(200), ScaleY(17));
Caption := 'Создать резервные копии файлов';
end;
end;
// Проверка присутствия определенных файлов в папке с установленной программой на странице выбора папки назначения
function NextButtonClick(CurPage: Integer): Boolean;
var
s: string;
begin
Result := True;
if CurPage = 6 then
begin
if (FileSearch('wylek.exe', ExpandConstant('{app}')) = '')
//Вставьте полное имя файла выше для проверки на присутствие
then
begin
s := 'Извините, в директории ' + ExpandConstant('{app}') + '' #13 'не обнаружены оригинальные файлы.' #13#13 'Пожалуйста, выберите правильный путь к папке для установки обновления.';
MsgBox(s, mbError, mb_Ok);
Result := False
end;
end;
end;
//Не забываем вставить порверку на присутствие проверяемого файла
procedure CurPageChanged(CurPageID: Integer);
var
MD5, s: string;
begin
if CurPageID = 12
then
begin
MD5 := GetMD5OfFile(ExpandConstant('{app}wylek.exe'));
if not (MD5 = 'fafdf9dca5f7faec44b4e18c1a7df1a8')
//Вставьте полное имя файла выше и MD5 с енг буквами В НИЖНЕМ РЕГИСТРЕ!
then
begin
s := 'Ошибка MD5 в файле обновления!' #13#13 'Установка прекращена.';
MsgBox(s, mbCriticalError, mb_Ok); //Если хеш файла(ов) не соответствует, выдается сообщение, и на этом все действия прекращаются.
WizardForm.Close; //Закрытие инсталлятора
Exit; //Прерывание и откат всех действий
end;
end;
end;
//Не забываем дописать еще такую процедуру
procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
Cancel := True;
if CurPage = 12 //Это непосредственно страница с индикатором выполнения
then
begin
Confirm := False; //На этой странице отключаем появление сообщения при нажатии на кнопку Отмена
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
var
MD5, s: string;
err : Boolean;
begin
if CurStep = ssInstall then
begin
err := False; // ошибки пока еще нет
CreateDir(ExpandConstant('{app}' + BackupDir));
if NewCheckBox1.Checked then BackupFile('wylek.exe');// Если стоит галка на чекбоксе то бекапим
case PatchFileFunc('wylek.exe') of
0: WizardForm.ProgressGauge.Position := WizardForm.ProgressGauge.Position + 33;
1: begin
if NewCheckBox1.Checked then RestoreFile('wylek.exe');
err := True; // если не удалось пропачить, то говорим, что была ошибка
end;
end;
case err of // проверяем состояние ошибки и выводим соответствующее сообщение
True : MsgBox('При русификации произошла ошибка!',mbError,MB_OK);
False: MsgBox('Программа успешно русифицирована!',mbInformation,MB_OK);
end;
end;
end;
//Вставьте полные имена файлов выше на каждую процедуру отдельно
и по коду изменения размера окна: окно то изменяется как угодно но кнопок нет, я пробовал в визуальном редакторе вывести их на передний план и задавал им нужные координаты но нет никакого эффекта9 апреля 2012 - 13:19 / #27 -
9 апреля 2012 - 14:22 / #28
-
9 апреля 2012 - 16:39 / #29
-
Цитата: Metabolicтак а что это - в чём различие?
Разница даже в одну букву приводит к полной неработоспособности кода. а иногда даже разница в раскладке при написании буквы, поэтому я могу помочь тебе только при наличии твоего кода, а не выложенного тут примера.17 апреля 2012 - 11:20 / #30
Статистика форума, пользователей онлайн: 1 (за последние 20 минут)
- Создано тем
- 1197
- Всего сообщений
- 15762
- Пользователей
- 18014
- Новый участник
- Markhabayev