На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ Inno Setup
Пожалуйста, выделяйте текст инсталлятора написанного на Inno Setup тегом [сode=ins] ... [/сode]. Для этого используйте кнопку [code=ins] в форме ответа или выпадающего списка, если нужно вставить код из другой программы.


Обязательно указывать:

  • Программу, используемую для создания инсталлятора.



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


Выразить свое отношение к модераторам раздела можно здесь: Profi, Fester
Модераторы: Fester
Закрыто Profi 02-07-2010: Only for Moderators

Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> FAQ , Inno Setup
    Начнем потихоньку собирать FAQ по Inno Setup.
      Q:Подскажите, как из скрипта отключить/включить кнопки Next и Prev?

      А:
      ExpandedWrap disabled
        Procedure CurPageChanged(CurPageID: Integer);
        begin
            if CurPageID=8 then //Тут только номер надо подобрать.
                WizardForm.NextButton.Enabled:=false
            else
                WizardForm.NextButton.Enabled:=true;
            if CurPageID=6 then //Тут тоже!
                WizardForm.BACKBUTTON.Enabled:=false
            else
                WizardForm.BACKBUTTON.Enabled:=true;
        end;
        Q:Как поменять текст "Распаковка файлов..." в диалоге непосредственной установки (там, где прогресбар) на мой.

        А:Как вариант, можно скрыть строку инсталлятора и создать свою!
        ExpandedWrap disabled
          var
           mt:TNewStaticText;
           
          Procedure CurPageChanged(CurPageID: Integer);
          begin
              if CurPageID=wpInstalling then begin
                  WizardForm.STATUSLABEL.visible:=false;
                  mt:=TNewStaticText.Create(WizardForm);
                  with mt do begin
                      Parent:=WizardForm;
                      Left := ScaleX(40);
                      Top := ScaleY(68);
                      Width := ScaleX(77);
                      Height := ScaleY(14);
                      Caption := 'Идет установка:';
                  end;
              end;
              if CurPageID=wpFinished then begin
                  mt.free;
                  mt:=nil;
              end;
          end;
          Q:Знает кто-нибудь, как зарегистрировать свою программу в качестве системной службы (сервиса)?

          A:
          ExpandedWrap disabled
            [Run]
            Filename: "{app}\MyProg.exe"; Parameters: "-install";


          Q:Нет, не подходит. Ничего не происходит даже если запустить её с этими параметрами. Наверное, службы на C# сами себя не регистрируют.

          A:Итак, регистрация любой службы: берем файл instsrv.exe (можно также бесплатно скачать с сайта MicroSoft) и запускаем примерно так:

          ExpandedWrap disabled
            [Run]
            Filename: "{sys}\instsrv.exe" ; Parameters: " ""Имя службы"" ""C:\Program Files\MyService\Myservice.exe"" "


          Только перед этим его надо скопировать в System32

          ExpandedWrap disabled
            [Files]
            Source: "C:\instsrv.exe"; DestDir: "{sys}"; Flags: onlyifdoesntexist uninsneveruninstall
            Q: Скажите, пожалуйста, как с помощью Inno Setup установить BDE, какие файлы для этого нужны?

            A:
            1. Качаем MiniReg.exe.
            2. Находим BDEINST.CAB в Program Files\Common Files\Borland Shared\BDE и извлекаем из него BDEINST.DLL.
            3. Добавляем такие строчки в скрипт
              ExpandedWrap disabled
                [Files]
                Source: "MiniReg.exe"; DestDir: "{tmp}"
                Source: "BdeInst.dll"; DestDir: "{tmp}"
                 
                [Run]
                Filename: "{tmp}\MiniReg.exe"; Parameters: """{tmp}\BdeInst.dll"""
            4. Пишем такой скрипт
              ExpandedWrap disabled
                procedure CreateAlias;
                const
                  FDbDriver = 'PARADOX'; //Тип базы.
                  SubDir = 'Data'; //Директория внутри папки установки программы.
                var
                  FAlias: string;
                  FAliasDir: string;
                begin
                  FAlias := 'aLog2000'; //Название базы.
                  Session.ConfigMode := cmPersistent;
                  if not Session.IsAlias(FAlias) then
                  begin
                    FAliasDir := ExtractFilePath(ParamStr(0)) + SubDir;
                    Session.AddStandardAlias(FAlias, FAliasDir, FDbDriver);
                    Session.SaveConfigFile;
                  end;
                end;

            A2: Качаем прикрепленный архив и извлекаем из него CheckBDE.dll, например, в MyDll. Копируем все указанные dron-s'ом файлы, а именно
            ExpandedWrap disabled
              bantam.dll
              blw32.dll
              charset.cvb
              idapi32.cfg
              idapi32.dll
              idasci32.dll
              idbat32.dll
              iddr32.dll
              idpdx32.dll
              idr20009.dll
              idsql32.dll
              other.btl
            в отдельный каталог, например BDE. Пишем такой скрипт:
            ExpandedWrap disabled
              [Files]
              Source: BDE\*; DestDir: {cf}\Borland Shared\BDE; Flags: uninsneveruninstall replacesameversion onlyifdoesntexist; Check: InstallBDE
              Source: MyDll\CheckBDE.dll; Flags: dontcopy
               
               
              [Code]
              Function CheckBDE:boolean;
              external 'CheckBDEInstalled@files:CheckBDE.dll stdcall';
               
              var
                  First:boolean;
                  BDEInstall:boolean;
               
              function InitializeSetup(): Boolean;
              begin
                  First:=true;
                  Result:=true;
              end;
               
              Function InstallBDE:boolean;
              begin
                  if First then begin
                      Result:=false;
                      if not CheckBDE then begin
                          if MsgBox('У вас не установлена BDE!'#13'Установить?',mbConfirmation,MB_YESNO)=IDYES then
                              Result:=true;
                      end;
                      BDEInstall:=result;
                      First:=false;
                  end else
                      Result:=BDEInstall;
              end;
              Q: В инсталляторе создаю новую страницу с TNewCheckListBox на ней. Вопрос, можно ли как-то заполнить его именами файлов из определенного каталога?

              A:
              ExpandedWrap disabled
                #define FindHandle
                #define FindResult
                #define Mask "F:\p2p на E\Games\Preferans\*.hlp"
                #sub ProcessFoundFile
                  #define fn FindGetFileName(FindHandle)
                  CheckListBox.AddCheckBox('{#fn}', '', 0, True, True, False, True, nil);
                #endsub
                 
                // где в секции [Code]
                 
                  CheckListBox := TNewCheckListBox.Create(Page);
                  CheckListBox.Width := Page.SurfaceWidth;
                  CheckListBox.Height := ScaleY(97);
                  CheckListBox.Flat := True;
                  CheckListBox.Parent := Page.Surface;
                  #for {FindHandle = FindResult = FindFirst(Mask, 0); FindResult; FindResult = FindNext(FindHandle)} ProcessFoundFile
                Q: Проблема в следующем - сетапка скомпилирована InnoSetup последней. На компах без прав администратора не ставится вообще.

                A: Вообще, чтобы инсталлятор сам говорил, что ему нужны права Админа в секции [Setup] должна быть строка:
                ExpandedWrap disabled
                  PrivilegesRequired=admin
                , иначе -
                ExpandedWrap disabled
                  PrivilegesRequired=none
                  Q: Скажите, как в InnoSetup сделать варианты установки.

                  A: В смысле Full, Standart, Custom и т.д.? Тогда так:

                  ExpandedWrap disabled
                    ;Типы установки.
                    [Types]
                    Name: full; Description: Full installation
                    Name: compact; Description: Compact installation
                    Name: custom; Description: Custom installation; Flags: iscustom
                     
                    [Components]
                    Name: program; Description: Program Files; Types: full compact custom; Flags: fixed
                    ;fixed - значит нельзя отключить!
                    Name: help; Description: Help File; Types: full
                    Name: readme; Description: Readme File; Types: full
                    Name: readme\en; Description: English; Flags: exclusive
                    Name: readme\de; Description: German; Flags: exclusive
                    ;exclusive - можно выбрать только одно из exclusive.


                  Q: Мне нужно, чтобы небыло видно входящих в вариант установки компонент.

                  A: Тогда придется создавать свою форму, размещать на ней все что надо, и использовать параметр Check:.

                  ExpandedWrap disabled
                    [Files]
                    Source: MyProg.exe; DestDir: {app}
                    Source: MyProg.hlp; DestDir: {app}; Check: FullCheck
                    ;Если FullCheck=True то файл установится!
                    Source: Readme.txt; DestDir: {app}; Flags: isreadme; Check: FullCheck
                    ;Source: 1.bmp; DestDir: {tmp}
                    ;Source: 2.bmp; DestDir: {tmp}
                     
                    [Code]
                    var
                        Page: TWizardPage;
                        BitmapImage1:TBitmapImage;
                        BitmapImage2:TBitmapImage;
                        RadioButton1:TRadioButton;
                        RadioButton2:TRadioButton;
                     
                    function FullCheck: Boolean;
                    begin
                      Result := RadioButton2.Checked;
                    end;
                     
                    procedure InitializeWizard();
                    begin
                        //ExtractTemporaryFile('1.bmp');
                        //ExtractTemporaryFile('2.bmp');
                        Page := CreateCustomPage(6, 'Выберите тип установки', 'Тут что-то еще написать можно!');
                        BitmapImage1 := TBitmapImage.Create(Page);
                        with BitmapImage1 do begin
                            Parent := Page.Surface;
                            Left := ScaleX(8);
                            Top := ScaleY(32);
                            Width := ScaleX(41);
                            Height := ScaleY(41);
                            //BitMap.LoadFromFile('D:\1.bmp');
                        end;
                        BitmapImage2 := TBitmapImage.Create(Page);
                        with BitmapImage2 do begin
                            Parent := Page.Surface;
                            Left := ScaleX(8);
                            Top := ScaleY(100);
                            Width := ScaleX(41);
                            Height := ScaleY(41);
                            //BitMap.LoadFromFile('D:\1.bmp');
                        end;
                        RadioButton1 := TRadioButton.Create(Page);
                        with RadioButton1 do begin
                            Checked:=true;
                            Parent := Page.Surface;
                            Left := ScaleX(8);
                            Top := ScaleY(8);
                            Width := ScaleX(265);
                            Height := ScaleY(21);
                            Caption := 'Пользовательсякая версия';
                            TabOrder:=0;
                            Font.Style := [fsBold];
                        end;
                        RadioButton2 := TRadioButton.Create(Page);
                        with RadioButton2 do begin
                            Parent := Page.Surface;
                            Left := ScaleX(8);
                            Top := ScaleY(76);
                            Width := ScaleX(265);
                            Height := ScaleY(21);
                            Caption := 'Администратиная версия';
                            TabOrder:=1;
                            Font.Style := [fsBold];
                        end;
                        st1 := TNewStaticText.Create(Page);
                        with st1 do begin
                            Parent := Page.Surface;
                            Left := ScaleX(52);
                            Top := ScaleY(32);
                            Width := ScaleX(77);
                            Height := ScaleY(14);
                            Caption := 'Ограниченная версия: доступен только поиск.'#13'Это версия для операторов.';
                        end;
                        st2 := TNewStaticText.Create(Page);
                        with st2 do begin
                            Parent := Page.Surface;
                            Left := ScaleX(52);
                            Top := ScaleY(104);
                            Width := ScaleX(77);
                            Height := ScaleY(14);
                            Caption := 'Полная версия.'#13'Установите её только на один компьютер!';
                        end;
                    end;
                    Q: При деинсталляции нужно вывести диалог с вопросом об удалении и при отрицательном ответе некоторые файлы не удалять?

                    A:
                    ExpandedWrap disabled
                      [Files]
                      Source: *.dmy; DestDir: {app}\DataA; Flags: uninsneveruninstall
                      Source: *.udb; DestDir: {app}\DataA; Flags: uninsneveruninstall
                       
                      [Code]
                      procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
                      var
                        FindFiles:TFindRec;
                      begin
                          if CurUninstallStep=usUninstall then begin
                              if MsgBox('Удалить файлы пользователя?', mbConfirmation, MB_YESNO) = IDYES then begin
                                  if FindFirst(ExpandConstant('{app}\DataA\*.dmy'), FindFiles) then begin
                                      repeat
                                          DeleteFile(ExpandConstant('{app}\DataA\')+FindFiles.Name);
                                      until not FindNext(FindFiles);
                                      FindClose(FindFiles);
                                  end;
                                  if FindFirst(ExpandConstant('{app}\DataA\*.udb'), FindFiles) then begin
                                      repeat
                                          DeleteFile(ExpandConstant('{app}\DataA\')+FindFiles.Name);
                                      until not FindNext(FindFiles);
                                      FindClose(FindFiles);
                                  end;
                              end;
                          end;
                      end;
                      Q: Как сделать так, чтобы папка с абсолютно всеми вложенными папками и файлами копировалась сразу?

                      A: Попробуй использовать флаг recursesubdirs
                      ExpandedWrap disabled
                        Source: "www\*"; DestDir: "{app}\www"; Flags: recursesubdirs
                        Q: Как узнать путь из реестра и установить туда в тихом режиме?

                        A:
                        ExpandedWrap disabled
                          [Files]
                          Source: "file.exe"; DestDir: "{reg:HKLM\Software\VST,VSTPluginsPath|DefaultValue}"
                          Q: Скажите, какой нужно использовать параметр установки в InnoSetup для того, чтобы на рабочем столе размещалась иконка при наведении курсора на которую выводилась инфа.

                          A:
                          ExpandedWrap disabled
                            Name: {userdesktop}\My program; Filename: {app}\MyProg.exe; Comment: Это просто коментарии к значку;
                            Q: В конфиге инны задаю значок для выходного файла. Так вот, при достижении, как я понял, определённого размера упаковываемых файлов (около 350 мб) значок остаётся стандартный виндовый.

                            A: Если ваш setup.exe составлено более чем несколько сотен мегабайт, Windows Explorer может показать стандартный значек файла вместо установленного вами. Кроме того, при просмотре свойств файла вкладка "Версия" может отсутствовать.
                            Это не ошибка Inno Setup. На самом деле проблема заключается в API Explorer используемых для извлечения иконок и сведений о версии.
                            Проблему возможно решить, включив разбиение пакета установки на несколько файлов с помощью директивы DiskSpanning=yes. При этом данные будут вынесены в один или несколько файлов *.bin (в зависимоти от настройки DiskSliceSize и размера исходных файлов), а сама программа установки будет занимать малый объём, который Windows Explorer'у под силу корректно обработать.
                            Код, демонстрирующий использование DiskSpanning:
                            ExpandedWrap disabled
                              DiskSpanning=yes
                              ;пусть файлы *.bin будут размером до 255 МБ
                              DiskSliceSize=268435456
                              Q: Как сделать универсальный инсталлятор для 32 и 64 битных систем?

                              A: Опытным путём выяснил следущее.

                              Как до того я говорил, используем 64-битный режим:
                              ExpandedWrap disabled
                                [Setup]
                                ArchitecturesInstallIn64BitMode=x64
                                //Не будем от него отклоняться, хотя возможно есть и другие способы.
                                 
                                //Затем обязательно указываем флаг 32:
                                [Files]
                                Source: "shutdown.exe"; DestDir: "{sys}"; Flags: 32bit ignoreversion overwritereadonly touch; Permissions: admins-full

                              так как мы пытаемся установить 32 битное приложение shutdown.exe. Если не установить соответствующий флаг,
                              то файл будет проигнорирован в процессе установки. И он вообще не будет установлен ни в одну директорию!

                              Если мы выполним установку как в нашем примере, то файл успешно будет установлен. Причём он появится одновременно
                              в двух папках system32 и SysWOW64. Но тут уже проявляется работа эмулятора WOW64 в который мы вникать не будем.

                              Если же мы будем устанавливать настоящее 64 битное приложение shutdown.exe, то наверное флаг указывать здесь не нужно.
                              Скорее всего он сразу будет установлен в system32 как и положенно. Но это только для случая с настоящими 64 бинариками.

                              С реестром ситуация похожа:
                              ExpandedWrap disabled
                                [Registry]
                                Root: HKLM32; Subkey: "Software\Microsoft\Windows NT\CurrentVersion\Winlogon"; ValueType: string; ValueName: "Userinit";
                                ValueData: "{win}\makedate.exe,{sys}\userinit.exe"; Flags: noerror; Permissions: admins-full

                              Только сама логика странная, почему скажем нельзя использовать обычный параметр Root: HKLM и какой смысл
                              имеет параметр HKLM64, который так же в нашем случае непригоден к использованию!
                              Однако аргумент HKLM32 вполне можно использовать, так как проверенно на реальной системе.
                                Q: Как в InnoSetup IDE вбить длинные строки, например, часто встречающиеся binary type data реестра
                                ExpandedWrap disabled
                                  ValueData: 00 00 00 00 10 00 00 e3 00 00 00 00 a2 00 00 ....
                                когда строка превышает 1024 символа?
                                A: Это лишь проблемма IDE, на самом деле кампилятор читает длинные строки, следовательно их можно
                                вписать в любом подходящем редакторе, например, notepad.exe и т.п.
                                Следует быть осторожным, затем при открытии скрипта в InnoSetup, хотя при сдвигах текста программы,
                                длинные строки перемещаются полностью корректно, но я не знаю что будет если скажем вырезать и затем вставить текст!
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Закрыто Profi 02-07-2010: Only for Moderators



                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0546 ]   [ 16 queries used ]   [ Generated: 28.03.24, 23:17 GMT ]