Делаем патч в Inno как на PatchWise Free…

Делаем патч в Inno как на PatchWise Free…От меня: я не создаю скрипты для Inno,
  1. Оффлайн

    Metabolic

    Звание: Прибывший

    Участники

    Сообщений: 14

    Создано тем: 0

    Рейтинг: 1

    Репа: 0

    Баллы: 51

    Был: 2023-12-04 17:04

    Скрипт с данной темы форума PеееatchSetup.rar
    мне бы приделать: сheckbox для бекапа и messagebox при успешном пропатчивании файла, например "Программа успешно русифицирована!"
    -и было бы совсем идеально!
    8 апреля 2012 - 14:26 / #21
  2. Оффлайн

    Gnom

    Звание: Новичок

    Знаток

    Сообщений: 79

    Создано тем: 1

    Рейтинг: 2

    Репа: (6|6|0)

    Баллы: 51

    Страна: не указана!

    Был: 2023-04-05 20:55

    Лайков: 2

    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= vpatch(1, ExpandConstant('{tmp}VPatch.dll'), 'vpatchfile', ExpandConstant('{tmp}' + PatchFile), ExpandConstant('{app}' + BackupDir + '' + FileName), ExpandConstant('{app}' + FileName));<br>end;<br>procedure BackupFile(FileName:= vpatch(1, ExpandConstant('{tmp}VPatch.dll'), 'vpatchfile', ExpandConstant('{tmp}' + PatchFile), ExpandConstant('{app}' + BackupDir + '' + FileName), ExpandConstant('{app}' + FileName));<br>end;<br>procedure BackupFile(FileName: string);<br>begin<br>        if not FileExists(ExpandConstant('{app}' + BackupDir + '' + Filename)) then<br>          FileCopy(ExpandConstant('{app}' + Filename), ExpandConstant('{app}' + BackupDir + '' + Filename), True);<br>end;<br>procedure RestoreFile(FileName: string);<br>begin<br>        FileCopy(ExpandConstant('{app}' + BackupDir + '' + Filename), ExpandConstant('{app}' + Filename), False);<br>        DeleteFile(ExpandConstant('{app}' + BackupDir + '' + Filename));<br>end;<br>procedure InitializeWizard();<br>begin<br>        ExtractTemporaryFile('VPatch.dll');<br>        ExtractTemporaryFile('MyPatch.dat');<br>        WizardForm.ReadyMemo.Height<!--smile:= ScaleY(0);<br>        NewCheckBox1 := TNewCheckBox.Create(WizardForm);<br>        with NewCheckBox1 do<br>        begin<br>          Parent := WizardForm.ReadyPage;<br>          SetBounds(ScaleX(8), ScaleY(24), ScaleX(97), ScaleY(17));<br>          Caption := 'NewCheckBox';<br>        end;<br>end;<br>// Проверка присутствия определенных файлов в папке с установленной программой на странице выбора папки назначения<br>function NextButtonClick(CurPage--><img alt=        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= True;<br>        if CurPage = 6 then<br>        begin<br>          if (FileSearch('wylek.exe', ExpandConstant('{app}')) = '')<br>//Вставьте полное имя файла выше для проверки на присутствие<br>          then<br>          begin<br>            s := 'Извините, в директории ' + ExpandConstant('{app}') + '' #13 'не обнаружены оригинальные файлы.' #13#13 'Пожалуйста, выберите правильный путь к папке для установки обновления.';<br>            MsgBox(s, mbError, mb_Ok);<br>            Result := False<br>          end;<br>        end;<br>end;<br>//Не забываем вставить порверку на присутствие проверяемого файла<br>procedure CurPageChanged(CurPageID:= True;<br>        if CurPage = 6 then<br>        begin<br>          if (FileSearch('wylek.exe', ExpandConstant('{app}')) = '')<br>//Вставьте полное имя файла выше для проверки на присутствие<br>          then<br>          begin<br>            s := 'Извините, в директории ' + ExpandConstant('{app}') + '' #13 'не обнаружены оригинальные файлы.' #13#13 'Пожалуйста, выберите правильный путь к папке для установки обновления.';<br>            MsgBox(s, mbError, mb_Ok);<br>            Result := False<br>          end;<br>        end;<br>end;<br>//Не забываем вставить порверку на присутствие проверяемого файла<br>procedure CurPageChanged(CurPageID: Integer);<br>var<br>        MD5, s: string;<br>begin<br>        if CurPageID = 12<br>          then<br>        begin<br>          MD5<!--smile:= GetMD5OfFile(ExpandConstant('{app}wylek.exe'));<br>          if not (MD5 = '9711713d2e4173cccfeeea1ffd76f129')<br>//Вставьте полное имя файла выше и MD5 с енг буквами В НИЖНЕМ РЕГИСТРЕ!<br>          then<br>          begin<br>            s := 'Ошибка MD5 в файле обновления!' #13#13 'Установка прекращена.';<br>            MsgBox(s, mbCriticalError, mb_Ok); //Если хеш файла(ов) не соответствует, выдается сообщение, и на этом все действия прекращаются.<br>            WizardForm.Close; //Закрытие инсталлятора<br>            Exit; //Прерывание и откат всех действий<br>          end;<br>        end;<br>end;<br>//Не забываем дописать еще такую процедуру<br>procedure CancelButtonClick(CurPage--><img alt=          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
            Cancel= True;<br>        if CurPage = 12 //Это непосредственно страница с индикатором выполнения<br>          then<br>        begin<br>          Confirm := False; //На этой странице отключаем появление сообщения при нажатии на кнопку Отмена<br>        end;<br>end;<br>procedure CurStepChanged(CurStep:= True;<br>        if CurPage = 12 //Это непосредственно страница с индикатором выполнения<br>          then<br>        begin<br>          Confirm := False; //На этой странице отключаем появление сообщения при нажатии на кнопку Отмена<br>        end;<br>end;<br>procedure CurStepChanged(CurStep: TSetupStep);<br>var<br>     MD5, s: string;<br>     err<!--smile: Boolean;<br>begin<br>     if CurStep = ssInstall then<br>     begin<br>         err := False; // ошибки пока еще нет<br>         CreateDir(ExpandConstant('{app}' + BackupDir));<br>        if NewCheckBox1.Checked then   BackupFile('wylek.exe');// Если стоит галка на чекбоксе то бекапим<br>        <br>         case PatchFileFunc('wylek.exe') of<br>         0--><img alt=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: 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;<br>         1:= WizardForm.ProgressGauge.Position + 33;<br>         1: begin<br>               if NewCheckBox1.Checked then  RestoreFile('wylek.exe');<br>              err<!--smile:= True; // если не удалось пропачить, то говорим, что была ошибка<br>            end;<br>         end;<br>         case err of // проверяем состояние ошибки и выводим соответствующее сообщение<br>           True --><img alt=            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;
    //Вставьте полные имена файлов выше на каждую процедуру отдельно

    Добавил вывод сообщений о буспешной/неуспешной русификации
    Сообщение отредактировал 3 августа 2018 - 09:18
    8 апреля 2012 - 15:38 / #22
  3. Оффлайн

    Metabolic

    Звание: Прибывший

    Участники

    Сообщений: 14

    Создано тем: 0

    Рейтинг: 1

    Репа: 0

    Баллы: 51

    Был: 2023-12-04 17:04

    "Gnom" Спасибо за скрипт - единственное его нужно немного подправить:
    сheckbox и messagebox есть, но инсталятор русифицирует только в том случае, если поставить галочку на бэкап, а если не ставить - инсталятор в конце инсталяции просто закрывается но файлы не русифицирует!
    8 апреля 2012 - 17:06 / #23
  4. Оффлайн

    Gnom

    Звание: Новичок

    Знаток

    Сообщений: 79

    Создано тем: 1

    Рейтинг: 2

    Репа: (6|6|0)

    Баллы: 51

    Страна: не указана!

    Был: 2023-04-05 20:55

    Лайков: 2

    Metabolic, попраил, чтобы только бекапило по чекбоксу.
    8 апреля 2012 - 21:17 / #24
  5. Оффлайн

    Metabolic

    Звание: Прибывший

    Участники

    Сообщений: 14

    Создано тем: 0

    Рейтинг: 1

    Репа: 0

    Баллы: 51

    Был: 2023-12-04 17:04

    Gnom попробуй ещё раз поправить:
    -с галочкой патчится нормально, а без выдаёт сообщение "При русификации произошла ошибка!"
    •и ещё вопрос - можно ли задать произвольную ширину и высоту окна инсталятора? (пробовал изменить в 'редакторе форм' но там получается лиш увеличить, а мне бы уменьшить.)
    8 апреля 2012 - 22:57 / #25
  6. Оффлайн

    Gnom

    Звание: Новичок

    Знаток

    Сообщений: 79

    Создано тем: 1

    Рейтинг: 2

    Репа: (6|6|0)

    Баллы: 51

    Страна: не указана!

    Был: 2023-04-05 20:55

    Лайков: 2

    Metabolic, По первому вопросу - покажи свой код - именно свой. по второму:
    procedure InitializeWizard();
    begin
       with WizardForm do
       begin
         AutoScroll := False;
         ClientHeight := ScaleY(100);// высота
         ClientWidth := ScaleX(500); // ширина
       end;
    end;

    указываешь нужный тебе размер
    Сообщение отредактировал 3 августа 2018 - 09:19
    9 апреля 2012 - 10:05 / #26
  7. Оффлайн

    Metabolic

    Звание: Прибывший

    Участники

    Сообщений: 14

    Создано тем: 0

    Рейтинг: 1

    Репа: 0

    Баллы: 51

    Был: 2023-12-04 17:04

    Код впринципе тот что ты мне поправлял! я только чекбокс перенёс на страницу "Выбор папок установки"
    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;   
       //Вставьте полные имена файлов выше на каждую процедуру отдельно

    и по коду изменения размера окна: окно то изменяется как угодно но кнопок нет, я пробовал в визуальном редакторе вывести их на передний план и задавал им нужные координаты но нет никакого эффекта
    Сообщение отредактировал 3 августа 2018 - 09:19
    9 апреля 2012 - 13:19 / #27
  8. Оффлайн

    Gnom

    Звание: Новичок

    Знаток

    Сообщений: 79

    Создано тем: 1

    Рейтинг: 2

    Репа: (6|6|0)

    Баллы: 51

    Страна: не указана!

    Был: 2023-04-05 20:55

    Лайков: 2

    Цитата: Metabolic
    RestoreFile("wylek.exe");


    Вот не тот-же это код. я должен быть уверен, что у тебя все в порядке с путями.
    Сообщение отредактировал 3 августа 2018 - 09:20
    9 апреля 2012 - 14:22 / #28
  9. Оффлайн

    Metabolic

    Звание: Прибывший

    Участники

    Сообщений: 14

    Создано тем: 0

    Рейтинг: 1

    Репа: 0

    Баллы: 51

    Был: 2023-12-04 17:04

    RestoreFile("wylek.exe");

    так а что это - в чём различие?
    код полностью как ты выложил, я даже свои файлы переименовал в wylek.exe
    Сообщение отредактировал 3 августа 2018 - 09:20
    9 апреля 2012 - 16:39 / #29
  10. Оффлайн

    Gnom

    Звание: Новичок

    Знаток

    Сообщений: 79

    Создано тем: 1

    Рейтинг: 2

    Репа: (6|6|0)

    Баллы: 51

    Страна: не указана!

    Был: 2023-04-05 20:55

    Лайков: 2

    Цитата: Metabolic
    так а что это - в чём различие?


    Разница даже в одну букву приводит к полной неработоспособности кода. а иногда даже разница в раскладке при написании буквы, поэтому я могу помочь тебе только при наличии твоего кода, а не выложенного тут примера.
    Сообщение отредактировал 3 августа 2018 - 09:21
    17 апреля 2012 - 11:20 / #30

Статистика форума, пользователей онлайн: 0 (за последние 20 минут)

---
Создано тем
1173
Всего сообщений
15311
Пользователей
17846
Новый участник
ZAZ968Alex