1. Главная страница » Компьютеры

Inno setup как создать инсталлятор

Автор: | 16.12.2019

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

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

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

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

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

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

  1. admin (по умолчанию, либо если отсутствует в конфиге) — для работы созданного инсталлятора потребуются администраторские привилегии;
  2. poweruser — потребуется членство в группе PowerUsers или Администраторы;
  3. none — запуск возможен от любого пользователя, но если у пользователя есть права администратора, то они будут использоваться;
  4. lowest — запуск также возможен от любого пользователя, но всегда будет использоваться права обычного пользователя (не рекомендуется).
  • Теперь переходите в блок [ Code] (если его нет, то создаём в самом конце скрипта) и пропишите две следующие функции:
  • Соберите проект.
  • Читайте также:  Nv print или cactus что лучше

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

    1. Не устанавливайте значение директивы PrivilegesRequired в lowest, т.к. в таком случае программа установки будет всегда работать с правами пользователя и установиться в %PROGRAMFILES% не сможет.
    2. В случае если вы собираетесь устанавливать динамические библиотеки или например шрифты в системные каталоги Windows, то обязательно делайте дополнительную проверку, например:

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

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

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

    25 комментариев к записи

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

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

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

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

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

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

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

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

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

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

    Доброго времени суток. Скажите пожалуйста сможете ли вы написать код проверки имени пользователя через реестр на стадии инициализации установки? Разъясняю, если имя пользователя на русском языке установка прекращалась с выводом диалогового окна что-то типа установка не возможна, если имя пользователя на английском языке, установка шла обычно. Или какие есть варианты, или подскажите в каком направлении идти. Спасибо.

    @Сергей
    Текущее имя пользователя, от имени которого запущен установщик, хранится в константе , а также может быть получено посредством функции GetUserName().

    Про константу и функцию GetUserName(), я знаю, я просто не могу взять значение из данной ветки реестра:
    Root: HKLM; SubKey: SOFTWAREMicrosoftWindows NTCurrentVersionProfileListS-1-5-21-2222678472-2290265271-4291998698-1000; ValueType: expandsz; ValueName: ProfileImagePath; ValueData: Users
    ; Flags: uninsdeletevalue uninsdeletekeyifempty так-как S-1-5-21-2222678472-2290265271-4291998698-1000 у каждого компа разный. Я хочу чтобы данная строка была по короче и применима ко всем компам и какой константой можно заменить S-1-5-21-2222678472-2290265271-4291998698-1000

    @Сергей
    Следует использовать именно GetUserName(), после чего проверять это значение на наличие запрещённых символов внутри блока code например при помощи регулярного выражения, перекрыв ряд системных функций.

    S-1-X — это уникальные идентификаторы пользователей в системе Windows NT. Они генерируется при создании учётной записи и представляет собой случайное уникальное значение, сгенерированное по шаблону (более подробно в MSDN). Ни в коем случае следует работать с этими значениями напрямую!

    Тогда как я понял проверку имени пользователя через реестр взять нельзя?. Тогда откуда брать проверку если скажем в системе два пользователя, один с правами администратора, другой простой пользователь. Если можно не большой примерчик, откуда брать имя пользователя с правами администратора, и с чем сравнивать (ну например русский шрифт верхнего и нижнего регистра).

    @Сергей
    Функция GetUserName() всегда возвращает имя пользователя, от имени которого запущена программа установки. Зачем вам проверять другие учётные записи? Программа всё равно установится для данного пользователя.

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

    Объясню еще раз, нужен код для проверки имени пользователя (на разных компах), если имя пользователя на кириллице установщик выдает окно где будет сказано что установка с таким именем запрещена, если имя пользователя на латинице тогда обычная установка.
    Есть такие примеры на проверку через реестр по имени программы, если программа установлена тогда установщик выдает сообщение что прога с таким именем установлена и закрывается (пример есть в справке), так вот хочу типа такого.

    @Сергей
    Это-то понятно. Мне вот только не очень понятно зачем проверять все остальные учётные записи в системе? Если программа устанавливается от конкретной, то она и работать будет от неё, поэтому результата функции GetUserName() для ваших целей будет достаточно. В блоке code переопределяете системные функции завершения процесса подготовки к установке и в них проверяете значение GetUserName() на наличие запрещённых символов по регулярному выражению или посимвольно, а затем продолжаете или отменяете установку. Это достаточно просто.

    Но если уж хочется всё-таки проверить все остальные учётные записи, то потребуется написать специальную функцию в блоке code, которая будет импортировать ряд функций WinAPI через external stdcall, через которые получать список пользователей ОС и уже затем проверять их все. Подробнее в MSDN.

    Пример работы с вызовами WinAPI из инсталляторов InnoSetup можно найти здесь.

    Нет я не сказал что проверять нужно все учётные записи. Проверяется учётная запись от имени которой запустили установщик.
    function GetUserName(): Boolean;
    begin
    if GetUserName(ExpandConstant(‘users’,
    MsgBox(‘Программа не может быть установлена’
    Result:= False;
    Подредактируйте где не правильно или дополните, а дальше я уж сам.

    Собственный инсталлятор

    Разработка собственного программного обеспечения это одна задача, а установка его — это совсем другое. Как только Вы создали свой продукт, необходимо подумать о том, каким образом он будет предоставляться конечному пользователю. Если это просто один исполняемый файл, который вы можете просто заархивировать и выложить, то все просто. Но когда Ваш продукт состоит из нескольких файлов таких как, например, dll, которые необходимо зарегистрировать, Вам уже необходим инсталлятор. Даже если Вам просто необходимо создать пару ярлыков на компьютерах пользователей, то инсталлятор уже будет удобен, если Вы, конечно, не хотите, чтобы ваши пользователи делали все вручную.

    Дорогой и коммерческий флагман InstallShield знаком всем, и Вы не раз пользовались инсталляторами, созданными этим продуктом. Но, он не является единственным оплотом для создания исталляторов. Существуют и достаточно способные бесплатные продукты, которые могут обеспечить Вас всеми необходимыми возможностями. Я выбрал несколько лучших из них. Они охватывают различные подходы к созданию инсталлятора: от быстрых и легко настраиваемых (5-10 минут и готово) до мощных и поддерживающих огромное количество настроек.

    Обзор бесплатных программ для создания инсталляторов

    Программа для создания инсталлятора Inno Setup полноценный инструмент

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

    GUI Inno Setup представляет из себя редактор / компилятор для файла конфигурации, который содержит настройки для создания программы установки. Формат текстового файла очень похож на формат файла INI, что позволяет ему быть менее громоздким для работы, чем файл формата XML, как, например, в Ghost Installer. Файл справки отлично структурирован, что позволяет легко и просто узнать о доступных параметрах. Редактор поддерживает схему цветовой подсветки кода, что делает его более удобным для работы. Я не буду перечислять все особенности этого профессионального инструмента для создания программы установки, но я не нашел ничего, что еще Inno Setup не будет в состоянии совершить. Исходные файлы, целевые файлы, ярлыки, диалоги, лицензии принятии, удаление, пользовательские формы и многое другое. Я использовал его в течение нескольких проектов за последние годы с большим успехом (а не затрат). Если вы любите GUI, то для этого отличного инструмента вы можете найти несколько сторонних дополнений на главной странице InnoSetup.

    Программа для создания инсталлятора NSIS удобная и мощная

    NSIS — если Вам не особо то и нужен редактор сценариев, и Вы хотите что-то обладающее более расширенными возможностями пользовательского интерфейса, то инструмент от NullSoft для создания программ установки то, что Вам нужно. Это наиболее способный продукт, в котором правда не хватает полноценного пользовательского интерфейса (не считая окна компилятора).

    Подобно тому как вы создаете HTML-код для веб-страницы в отдельной программе, и потом отображаете эту страницу в браузере, вы должны создать скрипт NSIS в любом редакторе по вашему вкусу и просто скомпилировать его компилятором NSIS. На домашней странице NSIS Вы можете найти ссылки на редакторы (PSPad, Notepad) и IDE плагины (например, для Eclipse) с поддержкой NSIS скриптов с подсветкой синтаксиса, а так же различные другие вспомогательные программы.

    Этот продукт, безусловно, более ориентирован на профессиональных разработчиков, чем на тех, кто ищет быстрых и легких графических решений для создания программ установки. Продукты в данном обзоре рассматривают оба типа этих пользователей, и это создает небольшие трудности для рекомендации одного единого решения. Хотя NSIS более способный, чем InnoSetup, я выбрал последнее из-за его баланса между графическим интерфейсом и функциональностью (включая организацию обучения).

    NSIS просто выводит одно маленькое окно с текстовыми ссылками, для того чтобы вы начали с изучения его бесконечных возможностей. Небольшое окно (действительно слишком маленькое, чтобы показать весь текст, но достаточное, чтобы не изменять размеры) содержит ссылки на сам компилятор, примеры скриптов, онлайн-поддержку, документацию и плагины.

    Плагины действительно того стоят, они предлагают множество расширенных возможностей, например, эффекты fadeout/fadein для пользовательских диалогов. NSIS предлагает создание более современной установки UI. Вы можете самостоятельно создавать собственные иконки, баннеры, фоны, и сделать из них свой сборник. Сообщество пользователей достаточно велико и многие ресурсы и форумы помогут Вам и поддержат Вас с вашим проектом установки NSIS.

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

    Программа для создания инсталлятора Ghost Installer аналог InnoSetup

    Ghost Installer представляет собой аналог InnoSetup. Если Вы хотите полностью контролировать создание программы установки, и Вы не боитесь работать с XML-файлами конфигурации, то Ghost Installer может быть хорошим выбором для Вас. Хотя коммерческая версия инструмента поставляется вместе с графическим интерфейсом (Ghost Installer Studio), бесплатная версия просто предлагает так называемый gEditor для редактирования файлов XML файлов конфигурации.

    Этот продукт требует времени, чтобы освоиться в нем, но как только Вы разберетесь и узнаете обо всех настройках, Вы сможете использовать всю мощь данного инструмента. Файл справки очень хорошо организован, в нем перечислены все ключевые слова и настройки, которые Вы можете использовать. Когда Вы создаете новый проект, мастер-настройки создаст базовый или расширенный шаблон, в котором будет подготовлена необходимая XML-структура, с который Вы можете сразу начать работать. Для меня этот инструмент был несколько сложнее в изучении, нежели InnoSetup, но я уверен, что этот инструмент очень мощный. В итоге мы имеем XML редактор gEditor со встроенной кнопкой, запускающей процесс компиляцию Вашей программы установки. Если для Вас такая схема работы привлекательна, то, безусловно, попробуйте его.

    Программа для создания инсталлятора Clickteam Install Creator быстрая и удобная

    Clickteam Install Creator, наверно, самый быстрый и удобный инструмент создания программ установки из тех, что я рассмотрел. Этот инструмент содержит основные функции, заключенные в эффективный графический интерфейс. Мастер достаточно быстро проведет Вас через основные шаги. Мой первый проект был сделан за несколько минут, и все работало на "ура!".

    Каждый этап представлен отдельной вкладкой, поэтому по завершении работы мастера у Вас всегда будет возможность изменить ранее заданные настройки. Если Вам требуется установить несколько исполняемых файлов, то Вам необходимо добавить меню в "Пуск" и создать ярлыки на рабочем столе. Инструмент позволяет легко изменять все тексты установки, даже текст в диалоговом окне "Добро пожаловать". Итоговая программа установки может работать как в режиме диалогового окна, так и в полноэкранном режиме (с возможностью установки градиента заливки фона, как в старые добрые времена Windows).

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

    CreateInstall аналог программы для создания инсталлятора Clickteam

    CreateInstall это удовольствие для тех, кто не хочет тратить много времени на процедуру создания программ установки и редактирования кучи текста. Инструмент очень похож на Clickteam Install Creator, он так же представляет собой простой и эффективный интерфейс, где вы можете быстро найти и настроить все важные особенности вашего проекта. Вы можете выбрать пользовательские растровые изображения и иконку для диалога установки, а также указать фоновый градиент заливки для полноэкранного режима. Вы можете настроить шесть диалогов установки и один диалог завершения установки.

    Работа с файлами и контекстным меню осуществляется достаточно легко, что является преимуществом над Install Creator. Так же Вам дается возможность задать записи в реестр и зарегистрировать DLL / OCX / TBL файлы. В инструменте есть некоторые дополнительные функции, которые производят достаточно хорошее впечатление. С ними Вы можете изменить некоторые особенности, такие как: выбор языка, выбор пути установки. Однако, у меня возникло несколько вопросов по работе инструмента, а именно по поводу изменения шрифтов диалогов. Для некоторых шрифтов, например, Tahoma, на дисплее будет просто пустое окно. Почему так? Бесплатная версия является полнофункциональной, но выводит строку "CreateInstall Free" в нижнем левом углу каждого окна установки. Вы можете купить этот инструмент, и изменить содержание этой строки по своему вкусу.

    Программа Advanced Installer для быстрого создания инсталлятора

    Advanced Installer является хорошим выбором, если Вам необходимо быстро создать MSI пакет установки. Caphyon предлагает бесплатную версию своего инструмента, встроенного в коммерческий продукт, по созданию программ установки. Вы можете скачать и установить полную версию продукта бесплатно, но только "Basic" опции работают без покупки регистрации. Но этого вполне достаточно для быстрого и простого создания MSI пакета установки.

    В нем достаточно дружественный интерфейс, позволяющий Вам задать все основные конфигурации в кратчайшие сроки. Есть довольно много вариантов установки, что позволяет Вам достаточно легко играть с инструментом, например, целевая папка, ярлыки, перезагрузка системы, условия запуска, настройки реестра и многое другое. Единственно, я разочаровался в том, что нельзя определить различные типы установки такие, как "Полная установка" и "Минимальная установка". "Все или ничего" — не есть принцип сегодняшних программ установки. Я бы предпочел вместо опции условий запуска опцию установки типа. Тем не менее, мне очень импонирует простота в использовании и минимальное количество времени на проект. Если вам нужен MSI файл для простой установки, то Advanced Installer, безусловно, то, что Вам нужно.

    Я не являюсь профессиональным программистом. В том смысле, что не зарабатываю денег этим ремеслом, а использую свои навыки в качестве инструмента для основной, научной, деятельности. Поэтому все мои «поделки» живут лишь отведенный им на решение конкретной задачи период и не выходят за пределы каталогов проекта. Кроме того, уже довольно давно я отошел от разработки под ОС Windows, ибо Linux для решения моих задач более удобен.

    Однако ученым тоже хочется кушать, прилично одеваться и заправлять машину. Поэтому (правда довольно редко) возникает необходимость немного пофрилансить.

    Недавно мне подкинули не слишком сложный проект — одна фирма хочет написать аналог программы, имеющейся у другой. Немного реверсинга, немного кодинга, в целом проект вполне обыденный. Однако тут же возник вопрос о создании инсталлятора — клиент ведь желает продукт «под ключ», чтобы клацнуть на «сетап», понажимать «Далее» и получить готовую к работе программу.

    Созданием инсталляторов я не занимался никогда. Поэтому данный вопрос был основательно «загуглен», в числе прочего попалась и такая статья с Хабра. Выбор средств для подобной задачи довольно широк, и включает как проприетарные, так и открытые продукты. Вот список того, что я «пощупал»

    1. InstallShield — классика жанра, достаточно солидный проприетарный продукт
    2. Adnvanced Installer — проприетарный инструмент с широкими возможностями кастомизации через GUI. На сайте сказано, что если Вы блоггер и будете писать об этом продукте много хороших слов, то у Вас есть возможность получить Free License
    3. WiX — открытый бесплатный продукт, основанный на XML-скриптах. Мощная, хорошо документированная штука. Разбираться с ним я пока не стал, ибо время дорого (да и к XML душа лежит не очень). Возможно когда нибудь я к нему вернусь. Да, к нему есть плагины для Visual Studio, что несомненный плюс.
    4. Inno Setup — опенсорсный проект, код которого доступен на гитхабе. В силу бесплатности и низкого порога вхождения мой выбор остановился именно на нем, как инструменте позволившем выполнить работу быстро и качественно.

    Так что в статье мы будем рассматривать пример использования Inno Setup, для которого имеется полезный фронтэнд Inno Script Studio, позволяющий выполнять создание простых инсталляторов с помощью мастера и менять настройки через GUI. GUI понадобился мне для первого знакомства, с продуктом, но мы не будем уделять ему большого внимания — мой «линукс головного мозга» в последнее время всё больше и больше уводит меня от желания использовать разного рода «мастера» (это субъективно, прошу не пинать). Мы рассмотрим хардкорный способ написания скрипта с чистого листа.

    Думаю, что скачать программу с официального сайта и установить её труда не составит. Запускаем Inno Setup Compiler и видим такое окно

    Пугающе уныло встречает нас Inno Setup.

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

    Прежде всего определим необходимые константы

    Эти строки будут часто встречаться в коде скрипта, поэтому определяем их, как и в C, с помощью дерективы #define

    Тело скрипта разделяется на секции, каждая из которых несет свое функциональное назначение. Обязательная секция [Setup] задает глобальные параметры работы инсталлятора и деинсталатора.

    Пристальное внимание уделаем опции AddId — уникальный идентификатор приложения (GUID), используемый для регистрации приложения в реестре Windows. Его пишем не «от фонаря», а генерируем, открывая фигурную скобку, и выбрав в меню пункт Tools -> Generate GUID (или используя хот-кей Shift + Ctrl + G). Далее указываем имя приложения, под которым оно будет установлено в системе, его версию, данные фирмы разработчика, адреса сайтов разработчика, технической поддержки и обновления.

    Путь, по умолчанию предлагаемый инсталлятором для установки определяем опцией DefaultDirName. При этом переменная — это путь в каталог Program Files соответствующей разрядности. Опция DefaultGroupName определяет имя группы программы в меню «Пуск». Обратите внимание на то, что для указания имени приложения мы используем данное нами выше макроопределение Name, обрамляя его фигурными скобками и решеткой.

    Пара опций OutputDir и OutputBaseFileName задают каталог, куда будет записан скомпилированный «сетап» и его имя (без расширения). Кроме этого, указываем где взять иконку для test-setup.exe опцией SetupIconFile.

    Последние опции в этой секции определяют алгоритм сжатия (LZMA) и указывают, что все файлы сжимаются одновременно, а не по отдельности (SolidCompression) что ускоряет процесс распаковки при большом количестве однотипных файлов.

    В хорошем исталяторе должна быть поддержка нескольких языков. Включаем её в наш «сетап», используя опциональную секцию [Languages]. При отсутствии данной секции будет использоваться английский язык.

    Каждая строка в данной секции задает один из используемых при установке языков. Синтаксис строки таков

    в качестве разделителя параметров используется точка с запятой. Параметр Name говорит сам за себя — «имя» языка, допускаются общепринятые двухбуквенные сокращения («en», «ru», «de» и так далее). Параметр MessagesFile сообщает компилятору в каком месте взять шаблон сообщений, выводимых при инсталляции. Эти шаблоны берем в каталоге компилятора Inno Setup, о чем мы сообщаем директивой compiler. Для английского языка годится шаблон Default.isl, для русского — LanguagesRussian.isl

    Параметр LicenseFile задает путь к файлу с текстом лицензии на соответствующем языке.

    Обычно установщик предлагает нам, например, определится, хотим мы или не хотим создать ярлык на рабочем столе. Такие опции установки определяются необязательной секцией [Tasks]

    Здесь Name задает имя операции — «desktopicom» — создание иконки на рабочем столе; Description — описание чекбокса с опцией, которое увидит пользователь. Конструкция

    задает стандартный текст сообщения, соответствующий выбранному в начале инсталляции языку. Параметр GroupDescription — заголовок группы чекбоксов с опциями. Параметр Flags задает определенные действия и состояния элементов управления, в данном случае указывая, что галочка «создать ярлык на рабочем столе» должна быть снята.

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

    • Source — путь к файлу-источнику. У меня всё необходимое программе для работы лежит в каталоге Release проекта MS VS
    • DestDir — каталог установки, переменная содержит путь, выбранный пользователем в окне установщика
    • Flags — разнообразные флаги. В нашем примере для исполняемого файла: игнорирование версии программы при перезаписи исполняемого модуля, если он уже существует в системе (ignorevarsion); для остальных файлов и каталогов так же игнорируем версию, рекурсивно включаем все подкаталоги и файлы источника (recursesubdirs) и создаем подкаталоги, если их нет (createallsubdirs)

    Наконец, чтобы всё было красиво, опционально укажем компилятору, где брать иконки для размещения в меню программ и на рабочем столе

    Тут я указываю, что для группы в меню «Пуск» и для рабочего стола иконку надо брать из исполняемого модуля. Естественно, что иконка должна быть в него «вкомпилена», иначе в требуемых местах мы увидим стандартный значок из коллекции винды.

    Итак, всё вроде готово. Жмем Ctrl + F9 и пытаемся собрать инсталлятор. Если не допущены синтаксические ошибки, начнется процесс сборки

    Inno Setup собирает инсталлятор

    После успешной сборки инсталлятор можно запустить, нажав F9. Если Вы работаете под учеткой с ограниченными правами (а я работаю в винде именно так), то придется полезть в каталог с результатами компиляции, который мы указали в скрипте, и запустить инсталлятор с правами админа

    Запуск инсталлятора под ограниченной учетной записью

    В итоге мы увидим до боли знакомое каждому пользователю Windows окно выбора языка

    приветствие мастера

    лицензионное соглашение

    ну и так далее. Приятно, что по умолчанию используется лаконичный дизайн мастера, без рюшечек (которые при желании можно добавить)

    Ну что сказать? Ура! Мы написали свой первый «сетап» и могли бы радоваться, но

    Вы не заметили, что мы о чем-то забыли? Приложение, созданное на C# не будет работать без фреймворка, с которым оно было собрано, если таковой отсутствует в системе. Соответствующий фреймворк надо установить, а для этого необходимо

    1. Определиться с тем, как будем получать дистрибутив фреймворка. Тут есть два варианта — поставлять его вместе с дистрибутивом программы или, при необходимости установки загрузить его онлайн на целевую машину. Мы остановимся на варианте включения фреймворка в дистрибутив. Сам фреймфорк, скажем версии 4.0, можно взять бесплатно у Майкрософта
    2. Детектировать наличие/отсутствие данного фреймфорка в целевой системе. Для этого потребуется написать логику, анализирующую состояние системного реестра.

    Значения в реестре, которые необходимо проверить приведены в официальной документации Microsoft, в статье я приведу краткую выжимку из неё

    Таблица 1. Ключи реестра, для проверки установленной версии .NET Framework

    Версия .NET Ключ реестра Значение
    3.0 HKLMSoftwareMicrosoftNET Framework SetupNDPv3.0SetupInstallSuccess 1
    3.5 HKLMSoftwareMicrosoftNET Framework SetupNDPv3.0SetupInstall 1
    4.0 Client Profile HKLMSoftwareMicrosoftNET Framework SetupNDPv4.0ClientInstall 1
    4.0 Full Profile HKLMSoftwareMicrosoftNET Framework SetupNDPv4.0FullInstall 1
    4.5 HKLMSoftwareMicrosoftNET Framework SetupNDPv4.0FullRelease номер релиза

    Для реализации произвольной логики работы инсталлятора в Inno Setup предусмотрена секция [Code]. В пределах этой секции размещается код реализующих логику функций на языке Pascal. Содежимое этой секции мы вынесем в отдельный файл dotnet.pas и включим в основной скрипт дерективой #include

    хотя можно набить код и непосредственно в секции [Code]. Надо помнить, что внутри этой секции используется синтаксис Pascal, и комментарии предваряются последовательностью "//" вместо используемой в основной части скрипта точки с запятой.

    Напишем функцию, определяющую наличие в системе нужной версии .NET

    Не смотря на обилие кода, логика его работы достаточно проста — в зависимости от значения параметра version с помощью функции RegQueryDWordValue(. ) читается значение соответствующего ключа реестра и сравнивается с требуемым значением (смотрим таблицу 1). Для версии 4.5 дополнительно передаем номер релиза в параметре release.

    Для того приложения, которое мы будем развертывать, нужна вполне определенная версия .NET, поэтому напишем функцию-обертку для её определения в целевой системе

    Для того, чтобы перед началом установки проверить наличие фреймворка и сообщить пользователю о предпринимаемых действиях используем Callback-функцию InitializeSetup()

    Теперь в секцию [Files] добавим запись о том, где компилятор должен взять дистрибутив .NET, куда инсталлятор он должен её распаковать, и при каких условиях следует выполнять распаковку

    Во флагах скажем, что надо удалить дистрибутив .NET после установки (deleteafterinstall). Условие, при котором требуется распаковка задаем опцией Check, где вызываем функцию IsRequiredDotNetDetected(), выполняя распаковку ели она вернет false.

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

    Обратите внимание на то, что мы сначала указываем имя секции [Run], чтобы закрыть секцию [Code], а затем пишем комментарий начинающийся с точки с запятой. Это необходимо из-за различия синтаксиса основного скрипта и секции [Code], в противном случае при компиляции мы получим синтаксическую ошибку.

    В секции задается путь к инсталлятору фреймворка — предварительно он распакован нами во временный каталог (переменная содержит путь к веременному каталогу); задаются параметры командной строки. Опция Check определяет условие запуска инсталляции — это отсутствие в целевой системе нужного нам фреймворка. Опция StatusMsg определяет сообщение, которое увидит пользователь в окне инсталлера.

    Снова компилируем наш проект. Теперь, при запуске на «чистой» винде инсталлятор выдаст сообщение

    Нам сообщают что требуется .NET Framework 4.0 и для нас его установят

    При распаковке мы заметим, что дополнительно распаковывает дистрибутив .NET во временную папку

    а затем процесс переключается на установку .NET

    Майкрософт просит нас принять лицензию.

    Установка .NET

    После этого мы получаем работоспособное C# приложение установленное «по взрослому»

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

    Код данного примера доступен в моем репозитории на Github. «Кракозябры» в комментах вызваны несовпадением кирилических кодировок. Для себя всегда пишу английские комментарии, но для лучшего понимания кода допустил этот ляп. При скачивании в винде всё просматривается замечательно, так что прошу простить мне и эту несуразность.

    В остальном, полагаю «хаутушка» вышла достойной и благодарю за уделенное мне внимание.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *