Делаем патч в Inno как на PatchWise Free…
Делаем патч в Inno как на PatchWise Free…От меня: я не создаю скрипты для Inno,
-
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
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('myprog.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}myprog.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
if NewCheckBox1.Checked then // Если стоит галка на чекбоксе
begin // то выполняем действия от сих
err := False; // ошибки пока еще нет
CreateDir(ExpandConstant('{app}' + BackupDir));
BackupFile('myprog.exe');
case PatchFileFunc('myprog.exe') of
0: WizardForm.ProgressGauge.Position := WizardForm.ProgressGauge.Position + 33;
1: begin
RestoreFile('myprog.exe');
err := True; // если не удалось пропачить, то говорим, что была ошибка
end;
end;
case err of // проверяем состояние ошибки и выводим соответствующее сообщение
True : MsgBox('При русификации произошла ошибка!',mbError,MB_OK);
False: MsgBox('Программа успешно русифицирована!',mbInformation,MB_OK);
end;
end; // до сих
end;
end;
//Вставьте полные имена файлов выше на каждую процедуру отдельно17 апреля 2012 - 18:55 / #31 -
Оффлайн
Автор темы
Звание: Легенда
Админ
Сообщений: 2195
Создано тем: 317
Рейтинг: 10
Репа: (245|245|0)
Баллы: 3580
Был: 2024-12-02 08:50
Лайков: 202
Вопрос к Gnom...
Есть два отличных кода от безрукости пользователей - Убить процесс при установке и Убить процесс при деинсталляции.
Они по отдельности прекрасно работают. А вот как их соединить вместе??? Есть необходимость процесс убить как и при установке так и при удалении русификатора.
Установкаfunction KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';
//**************************************************//
function InitializeSetup(): Boolean;
begin
If RunTask('Вася.exe', false) then
begin
if MsgBox('Программа Вася используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
begin
KillTask('Вася.exe');
Result:= True;
end else
Exit;
end;
Result:=True;
end;
Удалениеfunction RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}ISTask.dll stdcall delayload uninstallonly';
function KillTask(ExeFileName: string): Integer;
external 'KillTask@{app}ISTask.dll stdcall delayload uninstallonly';
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
if RunTask('Вася.exe', False) then
begin
// прячем форму
UninstallProgressForm.Visible:= False;
if MsgBox('Программа Вася используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
begin
KillTask('Вася.exe');
UnloadDll(ExpandConstant('{app}ISTask.dll'));
// показываем форму
UninstallProgressForm.Visible:= True;
end
else
begin
MsgBox('Завершите работу Вася, затем снова запустите программу удаления.', mbInformation, MB_OK);
UnloadDll(ExpandConstant('{app}ISTask.dll'));
Abort;
end;
end;
---------------------------------------------------------
Нашел решение
Функции разные сделать надо было и все теперь работает19 мая 2012 - 12:43 / #32 -
Для остальных, кто не понял
function KillTask_S(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';
function RunTask_S(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';
function RunTask_U(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}ISTask.dll stdcall delayload uninstallonly';
function KillTask_U(ExeFileName: string): Integer;
external 'KillTask@{app}ISTask.dll stdcall delayload uninstallonly';
//**************************************************//
function InitializeSetup(): Boolean;
begin
if RunTask_S('Вася.exe', false) then
begin
if MsgBox('Программа Вася используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
begin
KillTask_S('Вася.exe');
Result := True;
end else
Exit;
end;
Result := True;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
if RunTask_U('Вася.exe', False) then
begin
// прячем форму
UninstallProgressForm.Visible := False;
if MsgBox('Программа Вася используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
begin
KillTask_U('Вася.exe');
UnloadDll(ExpandConstant('{app}ISTask.dll'));
// показываем форму
UninstallProgressForm.Visible := True;
end
else
begin
MsgBox('Завершите работу Вася, затем снова запустите программу удаления.', mbInformation, MB_OK);
UnloadDll(ExpandConstant('{app}ISTask.dll'));
Abort;
end;
end;
end;
Не проверял, но должно работать.19 мая 2012 - 22:27 / #33 -
Оффлайн
Автор темы
Звание: Легенда
Админ
Сообщений: 2195
Создано тем: 317
Рейтинг: 10
Репа: (245|245|0)
Баллы: 3580
Был: 2024-12-02 08:50
Лайков: 202
Цитата: WYLEKПолный пакет для патча – PеееatchSetup.rar
Перезалил18 октября 2012 - 20:32 / #34 -
Оффлайн
Автор темы
Звание: Легенда
Админ
Сообщений: 2195
Создано тем: 317
Рейтинг: 10
Репа: (245|245|0)
Баллы: 3580
Был: 2024-12-02 08:50
Лайков: 202
Вопрос к Gnom...
Убить процесс при установке - мне понадобилось убить два процесса при установке, правильно или нет, но работает.
Если что - поправь.function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';
//**************************************************//
function InitializeSetup3(): Boolean;
begin
If RunTask('SoftCAT.exe', false) then
begin
if MsgBox('Программа SoftCAT сейчас выполняется. Вы хотите закрыть программу и продолжить установку русификатора?', mbInformation, mb_YesNo) = idYes then
begin
KillTask('SoftCAT.exe');
Result:= True;
end else
Exit;
end;
Result:=True;
begin
If RunTask('SoftCATSysTray.exe', false) then
begin
KillTask('SoftCATSysTray.exe');
Result:= True;
end else
Exit;
end;
end;
А вот Убить процесс при деинсталляции - как сделать убиение двух процессов?9 января 2013 - 02:31 / #35 -
я-бы вот так сделал:
Не забыть в файлах прописать ISTask.dll в папку установки.function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload setuponly';
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload setuponly';
//**************************************************//
function KillTaskU(ExeFileName: string): Integer;
external 'KillTask@{app}ISTask.dll stdcall delayload uninstallonly';
function RunTaskU(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}ISTask.dll stdcall delayload uninstallonly';
//**************************************************//
function InitializeSetup(): Boolean;
begin
Result:= True;
If RunTask('SoftCAT.exe', false) then
begin
if MsgBox('Программа SoftCAT сейчас выполняется. Вы хотите закрыть программу и продолжить установку русификатора?', mbInformation, mb_YesNo) = idYes then
begin
KillTask('SoftCAT.exe');
If RunTask('SoftCATSysTray.exe', false) then KillTask('SoftCATSysTray.exe');
end else Result:= False;
end;
end;
//**************************************************//
function InitializeUninstall(): Boolean;
begin
Result:= True;
If RunTaskU('SoftCAT.exe', false) then
begin
if MsgBox('Программа SoftCAT сейчас выполняется. Вы хотите закрыть программу и продолжить установку русификатора?', mbInformation, mb_YesNo) = idYes then
begin
KillTaskU('SoftCAT.exe');
If RunTaskU('SoftCATSysTray.exe', false) then KillTaskU('SoftCATSysTray.exe');
end else Result:= False;
end;
end;9 января 2013 - 07:21 / #36 -
Оффлайн
Автор темы
Звание: Легенда
Админ
Сообщений: 2195
Создано тем: 317
Рейтинг: 10
Репа: (245|245|0)
Баллы: 3580
Был: 2024-12-02 08:50
Лайков: 202
Цитата: Gnomя-бы вот так сделал:
Не работает. Если запущены два екзешника - то убивает процессы, если запущен первый екзкшник - то убивает процесс, если запущен второй екзкшник - убиение не происходит. Это происходит как при установке так и при удалении русификатора.9 января 2013 - 11:28 / #37 -
Оффлайн
Автор темы
Звание: Легенда
Админ
Сообщений: 2195
Создано тем: 317
Рейтинг: 10
Репа: (245|245|0)
Баллы: 3580
Был: 2024-12-02 08:50
Лайков: 202
Все сделал, пошел по пути на каждый екзешник своя процедура и все заработало. Теперь при установке и при деинсталляции все путем9 января 2013 - 20:02 / #38 -
замени везде PChar на PAnsiChar3 сентября 2013 - 20:21 / #39
-
Просто юникод-версия инно не знает типа Pchar. Объясняется это тем, что изначально был Char и указатель на него Pchar. Потом появился юникод и появился расширенный тип widechar, на который стал указывать Pchar а старый стали более явно указывать AnsiChar. Но в юникодную инно почему-то PWideghar не включили, поэтому, видимо и Pchar она не знает. Шапку сейчас поправлю, хотя с таким исправлением можно попробовать и на юникоде - если сама библиотека нормально работает, то достаточно исправить этот тип.Цитата: Kopejkinно дальше полезли другие ошибки.
там просто нужно строку кода завершить знаком точка с запятой. вот эту:
RestoreFile("wylek.exe");
Поправленый скрипт для юникода:5 сентября 2013 - 21:07 / #40