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

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

    Metabolic

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

    Участники

    Сообщений: 14

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

    Рейтинг: 1

    Репа: 0

    Баллы: 51

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

    { 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;
      //Вставьте полные имена файлов выше на каждую процедуру отдельно
    Сообщение отредактировал 3 августа 2018 - 09:55
    17 апреля 2012 - 18:55 / #31
  2. Оффлайн

    Автор темы

    WYLEK

    Звание: Легенда

    Админ

    Сообщений: 2178

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

    Рейтинг: 10

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

    Баллы: 3400

    Был: 2024-04-08 16:00

    Лайков: 196

    Вопрос к 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;


    ---------------------------------------------------------

    Нашел решение
    Функции разные сделать надо было и все теперь работает
    Сообщение отредактировал 3 августа 2018 - 09:56

    19 мая 2012 - 12:43 / #32
  3. Оффлайн

    Gnom

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

    Знаток

    Сообщений: 79

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

    Рейтинг: 2

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

    Баллы: 51

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

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

    Лайков: 2

    Для остальных, кто не понял

    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;

    Не проверял, но должно работать.
    Сообщение отредактировал 3 августа 2018 - 09:57
    19 мая 2012 - 22:27 / #33
  4. Оффлайн

    Автор темы

    WYLEK

    Звание: Легенда

    Админ

    Сообщений: 2178

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

    Рейтинг: 10

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

    Баллы: 3400

    Был: 2024-04-08 16:00

    Лайков: 196

    Цитата: WYLEK
    Полный пакет для патча – PеееatchSetup.rar



    Перезалил
    Сообщение отредактировал 3 августа 2018 - 09:57

    18 октября 2012 - 20:32 / #34
  5. Оффлайн

    Автор темы

    WYLEK

    Звание: Легенда

    Админ

    Сообщений: 2178

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

    Рейтинг: 10

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

    Баллы: 3400

    Был: 2024-04-08 16:00

    Лайков: 196

    Вопрос к 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;


    А вот Убить процесс при деинсталляции - как сделать убиение двух процессов?
    Сообщение отредактировал 3 августа 2018 - 09:58

    9 января 2013 - 02:31 / #35
  6. Оффлайн

    Gnom

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

    Знаток

    Сообщений: 79

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

    Рейтинг: 2

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

    Баллы: 51

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

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

    Лайков: 2

    я-бы вот так сделал:
    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;
    Не забыть в файлах прописать ISTask.dll в папку установки.
    Сообщение отредактировал 3 августа 2018 - 09:59
    9 января 2013 - 07:21 / #36
  7. Оффлайн

    Автор темы

    WYLEK

    Звание: Легенда

    Админ

    Сообщений: 2178

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

    Рейтинг: 10

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

    Баллы: 3400

    Был: 2024-04-08 16:00

    Лайков: 196

    Цитата: Gnom
    я-бы вот так сделал:



    Не работает. Если запущены два екзешника - то убивает процессы, если запущен первый екзкшник - то убивает процесс, если запущен второй екзкшник - убиение не происходит. Это происходит как при установке так и при удалении русификатора.
    Сообщение отредактировал 3 августа 2018 - 09:59

    9 января 2013 - 11:28 / #37
  8. Оффлайн

    Автор темы

    WYLEK

    Звание: Легенда

    Админ

    Сообщений: 2178

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

    Рейтинг: 10

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

    Баллы: 3400

    Был: 2024-04-08 16:00

    Лайков: 196

    Все сделал, пошел по пути на каждый екзешник своя процедура и все заработало. Теперь при установке и при деинсталляции все путем

    9 января 2013 - 20:02 / #38
  9. Оффлайн

    Gnom

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

    Знаток

    Сообщений: 79

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

    Рейтинг: 2

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

    Баллы: 51

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

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

    Лайков: 2

    замени везде PChar на PAnsiChar
    3 сентября 2013 - 20:21 / #39
  10. Оффлайн

    Gnom

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

    Знаток

    Сообщений: 79

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

    Рейтинг: 2

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

    Баллы: 51

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

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

    Лайков: 2

    Просто юникод-версия инно не знает типа Pchar. Объясняется это тем, что изначально был Char и указатель на него Pchar. Потом появился юникод и появился расширенный тип widechar, на который стал указывать Pchar а старый стали более явно указывать AnsiChar. Но в юникодную инно почему-то PWideghar не включили, поэтому, видимо и Pchar она не знает. Шапку сейчас поправлю, хотя с таким исправлением можно попробовать и на юникоде - если сама библиотека нормально работает, то достаточно исправить этот тип.
    Цитата: Kopejkin
    но дальше полезли другие ошибки.


    там просто нужно строку кода завершить знаком точка с запятой. вот эту:
    RestoreFile("wylek.exe");
    Поправленый скрипт для юникода:
    Сообщение отредактировал 3 августа 2018 - 10:00
    5 сентября 2013 - 21:07 / #40

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

Создано тем
1177
Всего сообщений
15331
Пользователей
17849
Новый участник
volk