Создание инсталлятора – Inno Setup

оригинал статьи: https://jazzteam.org/ru/

В этой статье пойдет речь про Inno Setup – удобный инструмент для упаковки приложений для OS Windows.

Введение

Почему Inno Setup? “Сегодня Inno Setup конкурирует и даже превосходит многие коммерческие инсталляторы в наборе функций и стабильности”, – говорится на официальном сайте разработчика. И действительно, этот инструмент довольно простой для освоения и мощный по своим возможностям.

На данный момент разработчики Inno Setup в качестве ключевых возможностей заявляют:

  • поддержку всех версий Windows, начиная с 2000;
  • поддержку как 64-битной, так и 32-битной установки;
  • встроенный обработчик скриптов Pascal  для более гибкой настройки;
  • возможность взять приложение и все файлы, которые нужны для его работы, и упаковать их в один компактный .exe файл;
  • Inno Setup поддерживает несколько режимов сжатия данных. При необходимости встроенное сжатие можно отключать и использовать сторонние архиваторы;
  • позволяет при установке добавлять ключи реестра, запускать дополнительные приложения во время, до и после установки;
  • возможность удалять ключи реестра и все следы активности программы, гибко настраивать деинсталлятор.

Первое знакомство

Скачать бесплатно стабильную версию Inno Setup Compiler можно с официального сайта. Там же можно найти FAQ и документацию на английском языке и сторонние библиотеки, упрощающие процесс создания Inno Setup Script (.iss).

В классическом приложении Inno Setup Compiler есть раздел Help, в котором можно найти FAQ, примеры скриптов и документацию.

При первом запуске программы пользователя встречает диалог, который предлагает посмотреть примеры, создать свой первый Inno Setup Script (.iss) с помощью мастера создания скриптов или открыть уже существующий .iss скрипт.

Для создания установочного файла можно воспользоваться мастером создания скриптов Inno Setup.

Мастер предложит заполнить:

  • сведения о приложении,
  • предпочтительные пути установки,
  • файлы, из которых будет состоять конечный дистрибутив,
  • нужны ли ярлыки, и если да, то где,
  • лицензионное соглашение,
  • документы с инструкциями,
  • имя и место для итогового дистрибутива,
  • пароль, если он требуется,
  • выбрать языки, которые должен поддерживать инсталлятор.

После того, как мастер соберет все необходимые сведения, он предложит скомпилировать полученный скрипт. В папке, которая была выбрана для итогового дистрибутива, будет лежать готовый к установке файл.

Расширенная настройка

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

Скрипт Inno Setup разделен на секции, каждая из которых отвечает за свой функционал. При этом бывает так, что для одной и той же цели могут подойти разные секции. Порядок выполнения секций строго определен и от расположения секций в скрипте не зависит.

Все секции скрипта, за исключением [Setup], [Messages], [CustomMessages], [LangOptions] и [Code], содержат строки, разделенные на параметры. Каждый параметр состоит из имени, за которым следует двоеточие, а затем значение. Если не указано иное, параметры являются необязательными, поскольку они принимают значение по умолчанию, если их не указать. Несколько параметров в строке разделяются точкой с запятой и могут быть перечислены в любом порядке.

Пример скрипта Inno Setup

В скрипте поддерживаются комментарии, для это нужно начать строку с точки с запятой ( “;” ).

Описание и примеры секций скрипта

В самом начале скрипта, до всех секций, определяются необходимые константы:

#define   MyAppName      "Example"
#define   MyAppVersion   "0.0.1"
#define   MyAppPublisher "example developer"
#define   URL        "http://www.example.com"
#define   MyAppURL   "example.exe"

В данном случае MyAppName – это имя приложения, MyAppVersion – версия приложения, MyAppPublisher – разработчик. Эти константы будут доступны в любой части скрипта и при необходимости что-то изменить, достаточно сделать это один раз в одном месте.

[Setup]

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

 AppId={{9E594ED6-EBDC-4D98-990E-F3F6B9AB9ACE}
 AppName={#MyAppName}
 AppVersion={#MyAppVersion}
 AppPublisher={#MyAppPublisher}
 AppPublisherURL={#MyAppURL}
 AppSupportURL={#MyAppURL}

Описание возможных директив секции Setup:

  • AppId – уникальный идентификационный номер приложения. Генерируется автоматически;
  • AppName – имя программы;
  • AppVersion – версия программы;
  • AppPublisher – разработчик программы;
  • AppPublisherURL – сайт разработчика программы;
  • AppSupportURL – сайт поддержки;
  • DefaultDirName – папка, в которую инсталлятор предложит установить программу по умолчанию;
  • DefaultGroupName – имя группы в меню меню “Пуск” которую инсталлятор предложит по умолчанию;
  • OutputBaseFilename – имя файла установки, который получится после компиляции скрипта;
  • OutputDir – папка, в которую будет помещен исполняемый файл инсталлятора;
  • AllowNoIcons – на странице выбора будет отображаться флажок “Не создавать значков”;
  • AlwaysShowDirOnReadyPage – всегда показывать папку для установки в списке настроек на странице “Всё готово к установке”;
  • CreateUninstallRegKey – при значении “no” инсталлятор не будет создавать пункт программы в диалоге “Установка и удаление программ”;
  • Uninstallable=no – не создавать деинсталлятор;
  • DirExistsWarning – при значении auto инсталлятор спросит “Папка: … уже существует. Вы хотите продолжить установку в эту папку?”;
  • LicenseFile – лицензионное соглашение;
  • InfoBeforeFile – эта информация будет отображена перед страницей “Выбор папки установки” прямо в окне инсталлятора. Здесь можно поместить советы по установке программы и другую информацию, которая будет полезна пользователю для успешной инсталляции вашего приложения;
  • InfoAfterFile – эта информация будет отображена после страницы “Выбор папки установки” прямо в окне инсталлятора;
  • UserInfoPage – при значении yes, установка отобразит страницу для ввода информации о пользователе. Полученные значения будут в константах {userinfoname} и {userinfoorg};
  • DefaultUserInfoName – имя пользователя, которое предложит инсталлятор по умолчанию;
  • DefaultUserInfoOrg – название организации, которое предложит инсталятор по умолчанию;
  • UsePreviousUserInfo – использовать имя пользователя, название организации и серийный номер, которые ввел пользователь при предыдущей установке;
  • UninstallRestartComputer – перезагрузить компьютер после удачного удаления программы;
  • PrivilegesRequired – установка доступна только от имени администратора;
  • Compression – параметры сжатия. Если есть необходимость использовать внешний архиватор, значение Compression нужно установить в “none”;
    • AlwaysRestart – после успешной установки компьютер перезагрузится;
  • RestartIfNeededByRun – компьютер будет перезагружен только если в этом нуждаются файлы, запускаемые из секции [Run];
  • UsePreviousAppDir – использовать папку, которую пользователь выбрал при прошлой установке;
  • UsePreviousGroup – использовать группу меню “Пуск”, которую указал пользователь при прошлой установке;
  • UsePreviousSetupType – использовать тип и компоненты предыдущей установки;
  • UsePreviousTasks – использовать задания, выбранные пользователем при предыдущей установке;
  • WizardImageFile – картинка, которая будет отображаться на завершающем экране инсталлятора (должна находиться в каталоге, обозначенном как SourceDir, либо к ней должен быть прописан полный путь). Изображение должно быть в формате .bmp и иметь размер не более 164x314px. Ранее эта картинка отображалась также и на приветственном экране, но по рекомендациям microsoft приветственного экрана желательно избегать;
  • WizardImageStretch – если установлено “yes” (не рекомендуется), по умолчанию изображения мастера установки будут растянуты или сжаты, до размера требуемого контейнера. Если установлено значение “no”, изображения мастера будут центрироваться в соответствующих областях. (Это соответствует поведению Inno Setup 4.1.2 и более ранних версий по умолчанию);
  • WizardImageBackColor – назначает цвет фона за картинкой. Возможные значения:
    • clRed (красный);
    • clYellow (желтый);
    • clOlive (оливковый);
    • clLime (ярко зеленый);
    • clGreen (зеленый);
    • clTeal (салатовый);
    • clAqua (зелено-голубой);
    • clBlue (ярко-синий);
    • clNavy (синий);
    • clPurple (фиолетовый);
    • clFuchsia (розовый);
    • clMaroon (коричневый);
    • clBlack (черный);
    • clGray (серый);
    • clSilver (серебряный);
    • clWhite (белый);
  • WizardSmallImageFile – маленькая картинка, во время инсталляции будет находиться в правом верхнем углу;
  • WizardSmallImageBackColor – назначает цвет фона за маленькой картинкой. Возможные значения такие же как у большой;
  • WindowVisible – если установлено “yes”, появится окно градиентного фона, отображаемое за мастером. Обратите внимание, что эта директива считается устаревшей и, вероятно, будет удалена в какой-то момент в будущем;
  • BackColor – начальный цвет градиентной заливки окна, отображаемого за мастером (WindowVisible);
  • BackColor2 – конечный цвет градиентной заливки заливки окна, отображаемого за мастером (WindowVisible);
  • BackColorDirection – направление градиентной заливки (WindowVisible);
  • BackSolid – по умолчанию “no”(градиентная заливка включена). При значении “yes” цвет фона будет сплошным и равным BackColor;
  • WindowShowCaption – если установлено значение “no”, программа установки будет действительно «полноэкранным» – у нее не будет панели заголовка или границы, и она будет поверх панели задач. Эта директива не действует, если WindowVisible не установлен на “yes”.
  • WindowVisible – если установлено “yes”, фоновое окно программы установки будет первоначально отображаться в максимизированном состоянии, не перекрывая панель задач. Эта директива не действует, если WindowVisible не установлен на “yes”;
  • WindowResizable – если установлено значение “no”, пользователь не сможет изменить размер фонового окна программы установки, когда он не будет максимальным. Эта директива не действует, если WindowVisible не установлен на “yes”;
  • FlatComponentsList – если для этой директивы установлено значение “yes”, программа установки будет использовать плоские флажки для списка компонентов. В противном случае программа установки будет использовать флажки “3D”;
  • AppCopyright – указывает сообщение об авторском праве, которое будет отображаться в правом нижнем углу фонового окна программы установки, когда параметр WindowVisible установлен в значение “yes”. Значение этой директивы также используется в качестве значения по умолчанию для директивы VersionInfoCopyright, если оно не указано;
  • SetupIconFile – задает значок инсталлятора. Файл должен быть расположен в исходной папке вашей установки при запуске компилятора установки, если не указано полное имя пути или имя пути префикс «компилятор:», и в этом случае он ищет файл в каталоге компилятора;
  • ShowComponentSizes – если для этой директивы установлено значение “yes”, программа установки покажет размер компонента в списке компонентов. В зависимости от самого большого компонента программа установки будет отображать размеры в килобайтах или в мегабайтах;
  • ShowTasksTreeLines – если для этой директивы установлено yes, программа установки покажет «древовидные линии» между родительскими и подзадачами;
  • UninstallDisplayIcon – значок для деинсталлятора в диалоге “Установка и удаление программ” Панели управления;
  • UninstallDisplayName – название программы в диалоге “Установка и удаление программ” Панели управления;
  • UninstallFilesDir – указывает каталог, в котором хранятся файлы «unins *. *» для деинсталлятора. Не стоит менять это значение при обновлении программы, иначе программа установки не найдет журналы удаления из предыдущих версий и, следовательно, не сможет их добавить;
  • UninstallIconFile – иконка, которая будет отображаться в правом верхнем углу окна удаления;
  • UninstallStyle – стиль деинсталлятора;
  • DisableStartupPrompt – если установлено “yes”, программа установки не покажет сообщение “Эта программа установит… на ваш компьютер…”. Этот параметр не действует, если UseSetupLdr установлен на “no”.

[Types]

Эта секция используется, если разработчик хочет предоставить пользователю на выбор некоторые варианты установки. Следует помнить, что сама по себе секция [Types] только описывает возможные для данной программы типы установки, и должна комбинироваться с другими секциями.

Name: "full"; Description: "Full installation"
Name: "compact"; Description: "Compact installation"
Name: "custom"; Description: "Custom installation"; Flags: iscustom

[Components]

Эта секция не является обязательной. Здесь определены все компоненты, которые будут отображаться на странице «Выбор компонентов» мастера, для настройки типа установки. Комбинируется с секцией [Types]. Если в секции [Components] перечислены компоненты, а секции [Types] не существует, типы установки будут созданы инсталлятором автоматически, и могут быть не такими, как вам хотелось бы.

 Name: "main"; Description: "Main Files"; Types: full compact custom; Flags: fixed
 Name: "help"; Description: "Help Files"; Types: full
 Name: "help\english"; Description: "English"; Types: full
 Name: "help\dutch"; Description: "Dutch"; Types: full

[Tasks]

Опциональная секция. Предоставляет пользователю возможность отметить задачи, которые он хотел бы выполнить во время установки. Эти задачи отображаются как флажки и переключатели на странице «Выбор дополнительных задач».Сами по себе задачи ничего не делают. Необходимо помечать какое-то действие в других секциях кодом Task: taskName; Такие действия будут выполнены, только если пользователь выбрал задачу на соответствующей странице.

[Task]
Name: desktopicon; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:"; Components: main; Flags: exclusive unchecked
[Icon]Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

В секции [Tasks] описывается задание. В окне инсталлятора оно появится после удачной установки приложения, перед страницей “Установка завершена”, и будет иметь вид строки, значение которой определит параметр Description. Задание выполнится, если пользователь поставит флажок в начале этой строки.

В секции [Icons] описывается, куда следует поместить ярлык, как ярлык будет озаглавлен и (по желанию) как он будет выглядеть, для какого именно файла он создается. Параметр Tasks секции [Icons] вызывает задание, описанное в секции [Tasks].

Для запуска каких-либо файлов секция [Tasks] не подходит – для этого существует секция [Run].

[Dirs]

Этот необязательный раздел определяет любые дополнительные каталоги помимо каталога приложений, который создается автоматически.
Обратите внимание, что вам не требуется явно создавать каталоги перед установкой файлов в них с помощью раздела [Files], поэтому этот раздел в первую очередь полезен для создания пустых каталогов. Пример, приведенный ниже, создает пустую папку “data” и “bin” в папке с приложением.

Name: "{app}\data"
Name: "{app}\bin"

[Files]

В этой секции определены любые файлы, которые необходимо установить в систему пользователя. Иногда достаточно указать  исполняемый файл, который запускает инсталлируемое приложение. Но чаще необходимы еще какие-то ресурсы.

Если устанавливаемый файл является файлом ReadMe, инсталлятор после удачной установки приложения может предложить пользователю прочесть этот файл. Для этого используется флаг isreadme секции [Files], но файл ReadMe пользователь сможет прочитать, только если после установки компьютер не будет перезагружен.

Также файлы секции [Files] могут иметь атрибуты: «системный» (system), «только для чтения» (readonly) и «скрытый» (hidden). За атрибуты файла отвечает параметр Attribs, и если он не указан, то файл не будет иметь вообще никаких атрибутов.

Source: "CTL3DV2.DLL"; DestDir: "{sys}"; Flags: onlyifdoesntexist uninsneveruninstall
Source: "MYPROG.EXE"; DestDir: "{app}"
Source: "C:\example.exe"; DestDir: "{app}"; Attribs: system hiddenSource: "README.TXT"; DestDir: "{app}"; Flags: isreadme 

[Icons]

Секция определяет ярлыки приложения, которые необходимо создать в меню «Пуск» и/или в других местах, например на рабочем столе. Следует помнить, что если ярлыки указаны только в секции [Icons], они будут создаваться всегда. Если для ярлыка, задан еще и параметр Tasks в секции [Tasks] , то ярлык будет создан, только если пользователь выберет соответствующее задание при установке программы).

Name: "{group}\My Program"; Filename: "{app}\MYPROG.EXE"; WorkingDir: "{app}"
Name: "{group}\Uninstall My Program"; Filename: "{uninstallexe}"

[INI]

Необязательная секция, определяющая, какие записи будут добавлены в INI-файл. Если INI-файл с заданным именем не существует в указанной папке, инсталлятор создаст его, а если INI-файл уже существует, он может добавить, удалить или изменить записи в нем, а также удалить существующий INI-файл и создать новый с тем же именем, но другим содержанием.

Filename: "MyProg.ini"; Section: "InstallSettings"; Flags: uninsdeletesection
Filename: "MyProg.ini"; Section: "InstallSettings"; Key: "InstallPath"; String: "{app}"

В этом примере Filename – имя INI-файла (с расширением .ini). Section – имя секции INI-файла (в полученном INI-файле будет заключено в квадратные скобки). Key – ключ INI-файла. String – значение ключа Key (строка).

[UninstallDelete]

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

Type: files; Name: "{win}\log.txt"

Для того, чтобы не перечислять все однотипные файлы, которые следует удалить при установке или удалении программы, можно использовать «маску»:

Type: files; Name: "{app}\*.ini"

В этом примере удалятся все файлы с расширением .ini. Задание «масок» для инсталлятора то же, что и для Windows: * – префикс (суффикс) любой длины, ? – префикс (суффикс) из одного символа и т.д.

[Languages]

Раздел  определяет языки, доступные в программе установки.

Name: "en"; MessagesFile: "compiler:Default.isl"
Name: "nl"; MessagesFile: "compiler:Languages\Dutch.isl"

[Messages]

Сообщения инсталлятора могут быть переопределены путем создания этой секции в файле сценария.

ButtonNext=&Forward >

[CustomMessages]

Раздел используется для определения значений сообщений для констант {cm: …}.

[CustomMessages]
CreateDesktopIcon=Create a &desktop icon
[Tasks]
Name: desktopicon; Description: "{cm:CreateDesktopIcon}"

[LangOptions]

Секция используется для определения языковых настроек, таких как шрифты, используемые программой установки и деинсталлятором. Как правило, вам не нужно создавать раздел [LangOptions] в вашем файле сценария, так как по умолчанию настройки, зависящие от языка, извлекаются из файла Default.isl, включенного в Inno Setup.

LanguageName=English
 LanguageID=$0409
 LanguageCodePage=0
 DialogFontName=
 DialogFontSize=8
 WelcomeFontName=Verdana
 WelcomeFontSize=12
 TitleFontName=Arial
 TitleFontSize=29
 CopyrightFontName=Arial
 CopyrightFontSize=8
 RightToLeft=no

Если перед параметром секции [LangOptions] не указан идентификатор языка, инсталлятор применит их ко всем языкам, заданным в секции [Languages] (кроме параметров LanguageName и LanguageID). Для того, чтобы изменения затронули только конкретный язык, перед параметром следует указать префикс (идентификатор языка и точку):

 rus.TitleFontSize=29

[Registry]

Этот необязательный раздел определяет любые ключи/значения реестра, которые необходимо создавать, изменять или удалять в системе пользователя во время установки.
По умолчанию ключи реестра и значения, созданные программой установки, при деинсталляции не удаляются. Чтобы при деинсталляции  удалялись ключи или значения, необходимо добавить один из следующих флагов uninsdelete.

 Root: HKCU; Subkey: "Software\My Company"; Flags: uninsdeletekeyifempty
 Root: HKCU; Subkey: "Software\My Company\My Program"; Flags: uninsdeletekey
 Root: HKLM; Subkey: "Software\My Company"; Flags: uninsdeletekeyifempty
 Root: HKLM; Subkey: "Software\My Company\My Program"; Flags: uninsdeletekey
 Root: HKLM; Subkey: "Software\My Company\My Program\Settings"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"
 Root: HKU; Subkey: {UserSid}\Software\Microsoft\Windows\CurrentVersion\Policies\System; ValueName: DisableRegistryTools; ValueType: dword; ValueData: 1

ValueType – тип значения. Может быть следующим:

  • none – значение по умолчанию. Инсталлятор создаст пустой ключ без параметра; ValueName и ValueData при этом игнорируются;
  • string – инсталлятор создаст строковый параметр (REG_SZ);
  • expandsz – инсталлятор создаст расширенную строку. Используется, например, чтобы дописать значение к уже существующему. (REG_EXPAND_SZ);
  • multisz – инсталлятор создаст многостроковый параметр (REG_MULTI_SZ);
  • dword – инсталлятор создаст целочисленный параметр (REG_DWORD);
  • binary – инсталлятор создаст двоичный параметр (REG_BINARY).

Если параметр ValueType равен string, expandsz или multisz, это будет строка, которая может содержать константы.
Если тип данных dword, это будет десятичное (“123”), шестнадцатеричное (“$7B”), или константа, представляющая собой целое число.
Если тип данных binary – последовательность шестнадцатеричных – десятичных байтов в форме: “00 ff 12 34”.
Если тип данных none, параметр игнорируется.

[Run]

Раздел является необязательным. В этой секции можно указать любое количество программ для выполнения после того, как программа была успешно установлена, но до того, как программа установки отобразит окончательный диалог. Раздел [UninstallRun] также является необязательным, и указывает любое количество программ для выполнения в качестве первого этапа удаления. Оба раздела имеют одинаковый синтаксис, если не указано иное.

Программы выполняются в том порядке, в котором они отображаются в скрипте. По умолчанию при обработке записи [Run] / [UninstallRun] программа установки / удаления будет ждать завершения программы до перехода к следующей, если не используются флаги nowait, shellexec или waituntilidle.

Filename: "{app}\INIT.EXE"; Parameters: "/x"
Filename: "{app}\README.TXT"; Description: "View the README file"; Flags: postinstall shellexec skipifsilent
Filename: "{app}\MYPROG.EXE"; Description: "Launch application"; Flags: postinstall nowait skipifsilent unchecked

[Code]

Pascal scripting (современный Delphi-подобный Pascal) добавляет множество новых возможностей для настройки вашей установки или удаления. Например:

  • поддержка прерывания установки или деинсталляции запуска в пользовательских условиях;
  • поддержка добавления пользовательских страниц мастера в программу установки во время выполнения;
  • поддержка для извлечения и вызова DLL или других файлов из сценария Pascal до, во время или после установки;
  • поддержка скриптовых констант, которые могут выполнять любые обычные константы, константы read-from-registry, read-from-ini и read-from-commandline, могут делать еще больше;
  • поддержка временного удаления типов, компонентов и / или задач;
  • поддержка условной установки записей [Files], [Registry], [Run] и т.д.

Pascal scripting делает почти все, что делает сама программа Inno и может делать еще больше.

Флаги

Большинство секций поддерживают параметр Flags. Этот параметр представляет собой набор дополнительных опций. Несколько флагов можно использовать в одной строке, разделяя их пробелами. В основном, для каждой секции предусмотрены свои специфические флаги.

[Registry]

  • uninsdeletevalue – удаляет значения ключа при деинсталляции;
  • deletekey – позволяет перед созданием нового ключа удалить уже существующий ключ со всеми его дочерними ключами, параметрами и значениями;
  • deletevalue – позволяет перед созданием нового параметра в ключе удалить уже существующий параметр того же типа и с тем же именем;
  • preservestringtype – если тип существующего параметра реестра не string или expandsz (т.е. не REG_SZ или REG_EXPAND_SZ), то он будет заменен строковым параметром с заданным значением, а если тип существующего параметра string или expandsz, заменится только его значение, а тип останется;
  • uninsclearvalue – при удалении приложения параметр в реестре установится в пустую строку (с типом REG_SZ);
  • uninsdeletekey – при удалении приложения удаляет ключ реестра со всеми его дочерними ключами, параметрами и значениями;
  • uninsdeletekeyifempty – при удалении приложения ключ реестра удалится, только если он пустой;
  • uninsdeletevalue – при удалении приложения удалится параметр реестра и его значение;
  • dontcreatekey – используется в ситуациях, когда при установке уже существующий параметр в ключе реестра следует заменить новым, а если ключ или параметр не существует – не создавать ни ключа, ни параметра;
  • createvalueifdoesntexist – инсталлятор создаст в ключе реестра параметр с заданным значением только в том случае, если он не существует. Не применяется с флагом deletevalue.

[Dirs]

  • deleteafterinstall – указывает инсталлятору создать папку, но после успешной установки или, если установка прервана, удалить ее, если она пустая. Если в папке будут содержаться файлы, с помощью этого флага она не удалится;
  • uninsalwaysuninstall – указывает деинсталлятору всегда пытаться удалять папку (если она пустая), даже если она уже существовала до начала установки приложения;
  • uninsneveruninstall – указывает деинсталлятору не удалять папку при удалении программы – обычно при удалении программы деинсталлятор удаляет все папки, которые были созданы инсталлятором при установке (если они пустые).

[Files]

  • ignoreversion – установить файл, который, возможно, уже установлен на компьютере пользователя и имеет более позднюю дату создания, т.е. является более новым (в этом случае инсталлятор по умолчанию оставит существующий файл);
  • promptifolder – по умолчанию, когда установленный файл имеет более старый номер версии, чем существующий файл, программа установки не заменит существующий файл. Когда этот флаг используется, программа установки спросит пользователя, следует ли заменять файл;
  • allowunsafefiles – отключает автоматическую проверку компиляторами для небезопасных файлов. Настоятельно рекомендуется, НЕ использовать этот флаг, если вы не уверены, что знаете, что делаете;
  • comparetimestamp – использование этого флага не рекомендуется, кроме как в крайнем случае, потому что в нем есть неотъемлемая проблема: разделы NTFS хранят отметки времени в UTC (в отличие от разделов FAT). Время будет сдвигаться всякий раз, когда пользователь изменяет часовой пояс своей системы или когда переход на летнее/зимнее время. Это может создать ситуацию, когда файлы заменяются, когда это не нужно или не заменяются, когда это нужно;
  • confirmoverwrite – всегда запрашивать у пользователя подтверждение перед заменой существующего файла;
  • onlyifdestfileexists – файл должен заменить уже установленный на компьютере пользователя файл с тем же именем, а если такого файла в системе пользователя нет, то вообще не устанавливаться. Этот флаг полезен в том случае, когда вы создаете инсталлятор для обновления (апдейта) уже установленной у пользователя программы. Но следует помнить, что пользователь может переименовать некоторые файлы программы, и тогда обновление не установится, даже если пользователь установил программу;
  • onlyifdoesntexist – установить файл, только в случае, если он еще не существует;
  • overwritereadonly – всегда перезаписывать файл, помеченный атрибутом “только для чтения”. Без этого флага программа установки будет запрашивать у пользователя, должен ли быть перезаписан существующий файл “только для чтения”;
  • replacesameversion – если уже установленный и устанавливаемый файлы имеют одну версию, по умолчанию инсталлятор не заменит уже установленный файл. Если установленный файл должен быть заменен (что рекомендуется), используется этот флаг;
  • nocompression – если задать отдельному файлу флаг nocompression, то инсталлятор не будет сжимать только заданный файл.

[INI]

  • uninsdeleteentry – используется для того, чтобы при удалении программы удалялся определенный ключ в заданной секции;
  • uninsdeletesection – показывает, что при удалении программы должна удалиться заданная секция со всеми ее ключами и их значениями;
  • uninsdeletesectionifempty – используется для того, чтобы при удалении программы удалялась только пустая секция;
  • createkeyifdoesntexist – ключ с заданным именем будет создан только в том случае, если до установки он не существовал.

[Run]

  • shellexec – применяется для файлов, которые не являются исполняемыми (.exe или .com) или командными (.bat или .cmd). С этим флагом файл запустится с помощью программы, принятой по умолчанию для его типа (например, файл ReadMe.txt будет отображен на странице Блокнота). Флаг shellexec не определяет, выполнилась программа или нет, поэтому его следует комбинировать с флагами nowait (инсталлятор не будет ждать, пока запущенный файл выполнится, и сразу перейдет к следующему параметру секции) или waituntilidle (в этом случае установка будет приостановлена для того, чтобы пользователь смог ввести необходимые данные);
  • postinstall – используется для того, чтобы пользователь мог выбрать, какие файлы он хочет запустить, а какие нет. С помощью параметра Description можно указать комментарий к каждому из представленных на выполнение файлов. Если он не указан, инсталлятор будет использовать стандартный комментарий;
  • unchecked – по умолчанию файл, помеченный таким флагом, будет не выбран;
  • hidewizard – во время выполнения программы окно инсталлятора будет скрыто;
  • unhidden – выполняемая программа (или файл) запустится в свернутом окне. Не следует использовать этот флаг для программы, при выполнении которой потребуется участие пользователя (например, он должен будет ввести какие-либо данные);
  • runmaximized – программа (файл) запустится в развернутом окне;
  • runminimized – программа (файл) запустится в свернутом окне;
  • skipifnotsilent – указывает инсталлятору не запускать файл при обычной (не ускоренной) установке;
  • skipifsilent – указывает инсталлятору не запускать файл при быстрой и очень быстрой установке;
  • skipifdoesntexist – не выдавать сообщение об ошибке, если запускаемый файл не существует.

Константы

Большинство записей в сценарии могут содержать в себе константы. Это предопределенные строки, заключенные в фигурные скобки {}. Программа установки или удаления преобразует константы в их литеральные значения, в зависимости от выбора пользователя и конфигурации системы.

Ниже приведен список используемых в Inno Setup констант:

  • {app} – папка установки, которую пользователь выбирает на странице «Выбор места назначения» мастера;
  • {win} – каталог ОС Windows. «C:\WINDOWS»;
  • {sys} – системная папка Windows. В 64-битной Windows по умолчанию путь System32, возвращаемый этой константой, сопоставляется с каталогом, содержащим 32-битные системные файлы, как и на 32-разрядной Windows. (Это может быть отменено путем включения 64-битного режима.);
  • {syswow64} – это фактический каталог, в котором находятся 32-разрядные системные файлы. В 32-битной Windows 32-разрядные системные файлы находятся в «System32» или «System», а не в отдельной директории SysWOW64, поэтому эта константа будет ссылаться на тот же каталог, что и {sys}. Не рекомендуется использовать эту константу, если нет конкретной потребности в получении имени фактического каталога, в котором находятся 32-разрядные системные файлы;
  • {sd} – указывает на корневую папку диска, где установлена ​​Windows, обычно «C:». Эта константа каталога эквивалентна переменной среды SystemDrive;
  • {pf} – путь к каталогу Program Files;
  • {cf} – путь к каталогу Common Files;
  • {tmp} – временная директория, используемая программой установки или удаления. Это не значение переменной среды TEMP пользователя. Это подкаталог временного каталога пользователя, который создается при установке или удалении при запуске (с именем типа «C: \ WINDOWS \ TEMP \ IS-xxxxx.tmp»). Все файлы и подкаталоги в этом каталоге удаляются при завершении установки или удаления;
  • {fonts} – каталог шрифтов. Обычно называется «FONTS» в каталоге Windows;
  • {dao} – DAO. Это эквивалентно {cf} \ Microsoft Shared \ DAO;
  • {dotnet11} – 32-разрядный корневой каталог .NET Framework версии 1.1.
    Если будет предпринята попытка обратиться к этой константе в системе без .NET Framework версии 1.1. будет брошено исключение;
  • {dotnet20} – корневой каталог .NET Framework версии 2.0-3.5. {dotnet20} эквивалентен {dotnet2032}, если установка не выполняется в 64-битном режиме, и в этом случае она эквивалентна {dotnet2064};
  • {dotnet2032} – 32-разрядная корневая директория .NET Framework версии 2.0-3.5;
  • {dotnet2064} – только 64-разрядная версия Windows: 64-разрядная корневая директория .NET Framework версии 2.0-3.5;
  • {dotnet40} – .NET Framework версии 4.0 и более поздней версии. {dotnet40} эквивалентно {dotnet4032}, если установка не выполняется в 64-битном режиме, и в этом случае она эквивалентна {dotnet4064};
  • {dotnet4032} – 32-разрядная версия .NET Framework версии 4.0 и более поздней версии;
  • {dotnet4064} – только 64-разрядная версия Windows: 64-разрядная версия .NET Framework версии 4.0 и более поздняя;
  • {group} – путь к папке «Пуск», выбранный пользователем на странице «Выбор папки« Меню «Пуск» меню «Настройка». Эта папка создается в профиле «Все пользователи», если пользователь, устанавливающий приложение, не имеет административных прав, и в этом случае он создается в профиле пользователя;
  • {localappdata} – путь к локальной папке Application Data;
  • {userappdata} & {commonappdata} – путь к папке Application Data;
  • {usercf} – путь к каталогу общих файлов текущего пользователя. Только Windows 7 и более поздние версии поддерживают {usercf}; если он используется в предыдущих версиях Windows, он переводится в тот же каталог, что и {localappdata}\Programs\Common;
  • {userdesktop} & {commondesktop} – путь к папке рабочего стола;
  • {userdocs} & {commondocs} – путь к папке «Мои документы»;
  • {userfavorites} & {commonfavorites} – путь к папке «Избранное»;
  • {userpf} – путь к каталогу Program Files текущего пользователя. Только Windows 7 и более поздние версии поддерживают {userpf}; если он используется в предыдущих версиях Windows, он будет переводиться в тот же каталог, что и {localappdata}\Programs;
  • {olddata} – позволяет дополнить уже существующее значение параметра реестра, если его ValueType равен string, expandsz, или multisz.

Заключение

После заполнения необходимых секций скрипт Inno Setup компилируется, и в папке, которую нужно было указать в директиве “OutputDir” в секции Setup генерируется исполняемый файл установщика. Для того чтобы скомпилировать скрипт, нужно в меню редактора выбрать Build -> Compile, как показано на скриншоте ниже:

Можно также выбрать Run -> Run, тогда скрипт скомпилируется и сразу начнется установка приложения.
В меню Help -> Inno Setup Example Scripts можно найти несколько примеров того, как этот инструмент позволяет настроить установщик, чтобы он выполнял ту или иную задачу.
Вообще, документация и FAQ, которые прилагаются к редактору скриптов, составлены очень понятно и подробно, там можно найти решение большинства основных задач. Есть и русскоязычные форумы, где происходит обсуждение скриптов инсталлятора, особенностей их создания. Там можно найти много интересных примеров или попросить совета. А когда все начнет получаться – делиться своими знаниями, а может даже и похвастаться своими успехами.