Главная > HOWTO > Создаём гибкий инсталлятор приложения в Inno Setup

Создаём гибкий инсталлятор приложения в Inno Setup

Очень часто требуется создать такой установщик, который бы был способен устанавливать программу как в каталог %PROGRAMFILES% (при наличии прав локального администратора), так и в %LOCALAPPDATA% (при отсутствии оных).

В данном HOWTO мы подробно рассмотрим процесс создания такого инсталлятора, приведём примеры работающего кода и опишем подводные камни, которые вам могут встретится.

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

  1. Откройте исходный код сценария установки (файл *.iss) в любом текстовом редакторе или самой среде Inno Setup.
  2. В блоке [Setup] найдите директиву DefaultDirName и замените её следующую:
    DefaultDirName={code:GetDefRoot}\App Name

    Здесь App Name — название вашего приложения (каталог, в который будет установлена программа; рекомендуется использовать только латинские буквы и цифры).

  3. В этот же [Setup] добавьте:
    PrivilegesRequired=none

    У этой директивы возможны следующие значения:

    1. admin (по умолчанию, либо если отсутствует в конфиге) — для работы созданного инсталлятора потребуются администраторские привилегии;
    2. poweruser — потребуется членство в группе PowerUsers или Администраторы;
    3. none — запуск возможен от любого пользователя, но если у пользователя есть права администратора, то они будут использоваться;
    4. lowest — запуск также возможен от любого пользователя, но всегда будет использоваться права обычного пользователя (не рекомендуется).
  4. Теперь переходите в блок [ Code] (если его нет, то создаём в самом конце скрипта) и пропишите две следующие функции:
    function IsRegularUser(): Boolean;
    begin
    Result := not (IsAdminLoggedOn or IsPowerUserLoggedOn)
    end;
    
    function GetDefRoot(Param: String): String;
    begin
    if IsRegularUser then
    Result := ExpandConstant('{localappdata}')
    else
    Result := ExpandConstant('{pf}')
    end;
  5. Соберите проект.

Подводные камни

  1. Не устанавливайте значение директивы PrivilegesRequired в lowest, т.к. в таком случае программа установки будет всегда работать с правами пользователя и установиться в %PROGRAMFILES% не сможет.
  2. В случае если вы собираетесь устанавливать динамические библиотеки или например шрифты в системные каталоги Windows, то обязательно делайте дополнительную проверку, например:
    Source: "dll\isxdl.dll"; DestDir: "{app}"; Flags: ignoreversion; Check: not IsRegularUser

    В противном случае вы получите критическую ошибку.

  3. При записи в разделы реестра, отличные от HKEY_CURRENT_USER, также делайте проверку наличия прав администратора (аналогично файлам).

Примеры

Готовый пример вы можете найти в нашем git репозитории проекта SRC Repair.

Категории:HOWTO Метки:, , ,
  1. MegaDocent
    22 апреля 2015 в 12:17 | #1

    Спасибо, помогло.
    Простое решение проблемы, какую папку предложить пользователю, если у него нет прав администратора.

  2. Михаил
    19 ноября 2015 в 13:11 | #2

    Приветствую. Надеюсь на вас!)))

    Как сделать возможность выбора из нескольких вариантов папки установки?
    У меня есть приложение, которое устанавливается в папку дополнений программы:

    Сама папка дополнений программы находится здесь — C:\Users\Admin\AppData\Roaming\Name
    Name — это название программы.

    В Inno я это прописал так:

    DefaultDirName={userappdata}\Name
    И все отлично работает.

    Но мое приложение пригодно и для другого софта. Поясню.
    Есть комната №1 — Name
    Но есть и другие. Например, Name2 и т. д. принадлежащие этой же сети.

    Вопрос. Есть ли возможность на этапе выбора места установки, предоставить пользователю возможность выбора между предложенными вариантами?
    Чтобы он из 4-5 вариантов поставил галочку на нужную ему и мое приложение установилось по выбранному пути.

    Можно конечно предложить ему вручную искать нужную ему папку, но хотелось бы позаботиться о нем и упростить этот момент.

  3. 23 ноября 2015 в 16:08 | #3

    @Михаил
    Можно написать свою собственную функцию в секции Code, которая будет проверять список каталогов и затем выводить отдельное окно или даже форму с вариантами выбора.

Представьтесь, пожалуйста! Если ваш комментарий предполагает ответ, мы ответим на него в ближайшее время. Адрес электронной почты должен быть действительным.


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