Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 5]

Закрытая тема
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 5]

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1274
Благодарности: 1030


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: El Sanchez
Дата: 16-02-2015
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:
Inno Setup [все вопросы] часть 1
Inno Setup [все вопросы] часть 2
Скрипты Inno Setup. Помощь и советы [часть 3]
Скрипты Inno Setup. Помощь и советы [часть 4]

Отправлено: 03:49, 21-05-2012

 

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Leka_651,

ok

постараюсь исправить
я так понял "резервно копировать" нужно 2 папки
те сначала резервируем
идёт установка
пользователь передумал
возвращаем папки на место

Отправлено: 15:34, 03-08-2012 | #521



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 27
Благодарности: 1

Профиль | Отправить PM | Цитировать


Johny777,
да, почти все правилно.
Нужно бекапить папку Модули со всеми подпапками, папку Jinnee и dll-файлы из корня. У меня механизм копирования есть.

А вот все вернуть обратно не получается.

Отправлено: 15:59, 03-08-2012 | #522


Новый участник


Сообщения: 27
Благодарности: 1

Профиль | Отправить PM | Цитировать


Johny777,
я поняла почему у меня остаются подпапки в папке Модули, а каталог Jinnee целиком удаляется
Стандартный механизм откатывает только то, что поставил сетап. Jinnee он ставит целиком и удаляет целиком, а из папки Модули удаляет только те подпапки, что успел поставить до нажатия кнопки "отмена".

Отправлено: 16:50, 03-08-2012 | #523


Аватара для Raf-9600

Старожил


Сообщения: 398
Благодарности: 21

Профиль | Отправить PM | Цитировать


Наверно немного нубский вопрос, но как сделать чтобы отображалась страница выбора папки в пеню "Пуск"? В старых версиях Inno эта страница отображалась просто если есть DefaultGroupName, а сейчас что нужно сделать для её активации?

Отправлено: 16:52, 03-08-2012 | #524


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Leka_651,
вопрос:
как инсталл должен вести себя при удалении?
также откатывать всё назад как при отмене установки?



Raf-9600,
нужна секция ярлыков

Последний раз редактировалось Johny777, 03-08-2012 в 17:22.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:59, 03-08-2012 | #525


Новый участник


Сообщения: 27
Благодарности: 1

Профиль | Отправить PM | Цитировать


Johny777,
при удалении нужно чтобы удалялось все, кроме каталога db. он и бекапиться не должен.

Отправлено: 17:18, 03-08-2012 | #526


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Leka_651,
в общем для того чтобы помочь тебе с кнопкой отмены мне нужен твой код целиком или самодостаточный вариант бэкапа с файлами для теста

но его нет поэтому сделал свой вариант бэкапа
в нём устранены все дисфункции твоей системы резервного коприрования (по функционалу)

======================================
вот (приписал несколько комментариев) :

читать дальше »
Код: Выделить весь код
#define JINNEE_DIR  "JINNEE_DIR"
#define CLIENT_DIR  "CLIENT_DIR"


[Setup]
AppName=Icon_Demo
AppVerName=Icon_Demo
DefaultDirName={pf}\Icon_Demo
Compression=none

[Files]
Source: My_CLIENT_DIR\*; DestDir: {app}\{#CLIENT_DIR}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: My_JINNEE_DIR\*; DestDir: {app}\{#JINNEE_DIR}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[code]
type
   TSHFileOpStruct=record
     Wnd: HWND;
     wFunc: UINT;
     pFrom: PChar;
     pTo: PChar;
     fFlags: Word;
     fAnyOperationsAborted: BOOL;
     hNameMappings: HWND;
     lpszProgressTitle: PChar;
   end;

function SHFileOperation(const lpFileOp: TSHFileOpStruct):integer; external 'SHFileOperation@shell32.dll stdcall';

function CopyFile_(FromFile,ToDir:string;IsRemove:boolean):boolean;
var
  F:TShFileOpStruct;
  a1,a2:string;
begin
  F.Wnd:=0;
  if IsRemove then F.wFunc:=$0001 else F.wFunc:=$0002;
  a1:=FromFile+#0#0;
  F.pFrom:=PChar(a1);
  a2:=AddBackslash(ToDir)+#0#0;
  F.pTo:=PChar(a2);
  F.fFlags:=$0254;
  Result:=(ShFileOperation(F)=0);
end;

procedure BackupDir(const FromDir,ToDir,FileMask :string; IsRemove,IncludeSubDirs: boolean);
var
  FindRec:TFindRec;
  sFileName,fd,td:string;
begin
  fd:=AddBackslash(FromDir);
  td:=AddBackslash(ToDir);
  ForceDirectories(td);
  if FindFirst(fd+FileMask,FindRec) then begin
    try
      repeat
        sFileName:=fd+FindRec.Name;
        if ((FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY)=0) then CopyFile_(sFileName,td,IsRemove)
        else
          if IncludeSubDirs then
            if (FindRec.Name<>'') and (FindRec.Name<>'.') and (FindRec.Name<>'..') then
              BackupDir(sFileName,td+FindRec.Name,FileMask,IsRemove,IncludeSubDirs);
      until not FindNext(FindRec);
    finally
      FindClose(FindRec);
    end;
  end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssInstall: // этап установки /// перед установкой
    begin
      if (DirExists(ExpandConstant('{app}\{#CLIENT_DIR}')) or DirExists(ExpandConstant('{app}\{#JINNEE_DIR}'))) and /// если эти папки существуют в директории установки
      not (DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) and DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) and DirExists(ExpandConstant('{app}\DLL_BACKUP'))) then  /// а эти с бэкапом нет, то
      begin
        with WizardForm do
        begin
          StatusLabel.Caption := 'Резервное копирование папки {#CLIENT_DIR}'; /// в лейбл статуса пишем "резервное копирование..."
          CancelButton.Enabled := False; /// для кравоты и не только блокируем кнопку "Отмена"
          ProgressGauge.Visible := CancelButton.Enabled; /// и делаем прогрессбар невидимым

          /// дополнительно: если папка существует /// то копируемв в такую же с припиской _BACKUP
          if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}')) then BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}'),ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),'*.*',False,True);  
          
          /// дополнительно: если папка существует /// то копируемв в такую же с припиской _BACKUP
          if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}')) then BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}'),ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),'*.*',False,True);
          
          /// копируем библиотеки по маске*(расширению) в папку DLL_BACKUP
          BackupDir(ExpandConstant('{app}'),ExpandConstant('{app}\DLL_BACKUP'),'*.dll',False,True);

          CancelButton.Enabled := True; /// делаем кнопку "Отмена"  активной
          ProgressGauge.Visible := CancelButton.Enabled; /// ну и зависмсость прогресбара от состояния кнопки, те видимым
        end;
      end;
    end;
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean );
begin
  case CurPageID of /// если ай-ди страницы...
  
    wpInstalling: ///...страница установки
    begin
      case ExitSetupMsgBox of
      
        True:
        begin
            if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) or DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then  /// если существуют файлы бэкапа
            begin
              Confirm := False;  /// убираем подтверэдение

              with WizardForm do
              begin
                StatusLabel.Caption := SetupMessage(msgStatusRollback); // в статул лейбл пишем "Откат..."
                CancelButton.Enabled := False; /// для красоты блокируем кнопку "Отмена"
                ProgressGauge.Visible := CancelButton.Enabled; /// прячем прогресбар
                FilenameLabel.Hide; /// прячем застывший лейбл отображающий какой файл только что распаковывался

                if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) then /// здесь тоже самое, только в обратную сторону с удалением
                begin
                  DelTree(ExpandConstant('{app}\{#CLIENT_DIR}'), True, True, True); /// удаляем установленную нами папку    CLIENT_DIR
                  BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),ExpandConstant('{app}\{#CLIENT_DIR}'),'*.*',False,True); /// из бэкапа - пользовательские файлы копируем в папку которую только что удалили - CLIENT_DIR
                  DelTree(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'), True, True, True); /// удаляем папку бэкапа. Дальше по аналогии
                end;

                if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then
                begin
                  DelTree(ExpandConstant('{app}\{#JINNEE_DIR}'), True, True, True);
                  BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),ExpandConstant('{app}\{#JINNEE_DIR}'),'*.*',False,True);
                  DelTree(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'), True, True, True);
                end;

                if DirExists(ExpandConstant('{app}\DLL_BACKUP')) then
                begin
                  BackupDir(ExpandConstant('{app}\DLL_BACKUP'),ExpandConstant('{app}'),'*.dll',False,True);
                  DelTree(ExpandConstant('{app}\DLL_BACKUP'), True, True, True);
                end;
              end;

              Cancel := True;    /// выходим из инсталла
            end;
        end;
        
        False: Cancel := False;
        
      end;
    end;
  end;
end;


Цитата Leka_651:
при удалении нужно чтобы удалялось все, кроме каталога db. он и бекапиться не должен. »
[UninstallDelete]
Type: filesandordirs; Name: not "{app}\db"

если нужно откатывать бэкап при удалении, то вот функция

читать дальше »
Код: Выделить весь код
#define MyAppName "DisksInfo"
...

function InitializeUninstall(): Boolean;
var
    Errorcode: Integer;
begin
    Result := False;

    if not UninstallSilent then
    begin
        Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ErrorCode);
        Exit;
    end;

    if MsgBox(FmtMessage(SetupMessage(msgConfirmUninstall), ['{#MyAppName}']), mbInformation, MB_YESNO) = idYes then
    begin
        if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) then /// здесь тоже самое, только в обратную сторону с удалением
        begin
          DelTree(ExpandConstant('{app}\{#CLIENT_DIR}'), True, True, True); /// удаляем установленную нами папку    CLIENT_DIR
          BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),ExpandConstant('{app}\{#CLIENT_DIR}'),'*.*',False,True); /// из бэкапа - пользовательские файлы копируем в папку которую только что удалили - CLIENT_DIR
          DelTree(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'), True, True, True); /// удаляем папку бэкапа. Дальше по аналогии
        end;

        if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then
        begin
          DelTree(ExpandConstant('{app}\{#JINNEE_DIR}'), True, True, True);
          BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),ExpandConstant('{app}\{#JINNEE_DIR}'),'*.*',False,True);
          DelTree(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'), True, True, True);
        end;

        if DirExists(ExpandConstant('{app}\DLL_BACKUP')) then
        begin
          BackupDir(ExpandConstant('{app}\DLL_BACKUP'),ExpandConstant('{app}'),'*.dll',False,True);
          DelTree(ExpandConstant('{app}\DLL_BACKUP'), True, True, True);
        end;
    
        Result := True;
        MsgBox(FmtMessage(SetupMessage(msgUninstalledAll), ['{#MyAppName}']), mbInformation, MB_OK);
    end
    else Result := False;
end;



пользуйся!

Разве установка должна отменяться без подтверждения ("Вы уверены...")?

Последний раз редактировалось Johny777, 03-08-2012 в 18:04. Причина: устарнил признаки своей безграмотности

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:22, 03-08-2012 | #527


Новый участник


Сообщения: 27
Благодарности: 1

Профиль | Отправить PM | Цитировать


Johny777,
спасибо огромное пошла пробовать.

Цитата Johny777:
в общем для того чтобы помочь тебе с кнопкой отмены мне нужен твой код целиком или самодостаточный вариант бэкапа с файлами для теста »
я могу тебе прислать весь код, но его много.

Цитата Johny777:
Разве установка должна отменяться без подтверждения ("Вы уверены...")? »
Обязательно нужно спрашивать. Я хочу в итогов варианте оставить только сообщение "Вы уверены что хотите отменить установку?". Все остальные сообщения уберу) зачем загружать пользователя.

Отправлено: 17:53, 03-08-2012 | #528


Аватара для nik1967

Старожил


Сообщения: 440
Благодарности: 251

Профиль | Сайт | Отправить PM | Цитировать


Цитата Johny777:
если хочешь дам тебе папку всех кодов какие есть
только в ней порядок сначала навести нужно »
Буду только рад.

-------
Если сообщение оказалось полезным для Вас, то помимо спасибо, можно нажать на "Полезное сообщение".


Отправлено: 18:26, 03-08-2012 | #529


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ну дак что, мне кто-нибудь поможет?

Отправлено: 19:03, 03-08-2012 | #530



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 5]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59
Inno Setup tradeukraine Вебмастеру 3 13-06-2006 20:39




 
Переход