Предназначены для создания дистрибутивов программ и пакетов программ.
Задачи, выполняемые подобными программами для различных платформ, могут сильно различаться. Мало того, с выходом Windows Installer и опубликования его API для платформы Win32 началось разделение программ на поддерживающие Windows Installer и использующие свои средств.
Как правило, все дистрибутивы имеют интерфейс программ-мастеров (т.е. пошаговое уточнение настроек). Кроме того, почти всегда имеется возможность удаления установленной программы.
— ориентированны на использование Windows Installer или используют свои средства;
— возможность автоматического отслеживания зависимостей исполнимых файлов и разделяемых библиотек;
— наличие встроенного языка сценариев;
— возможность и пределы, в которых можно изменять поведения мастера инсталляции;
— возможность использования и поддержка национальных языков;
— функции, поддерживаемые в процессе установки (кроме копирования файлов):
Inno Setup. Как создать свой установщик ?
— создание ключей реестра;
— перезагрузка системы после или в процессе установки;
— возможность удаления установленной программы;
— возможность контроля версий устанавливаемой программы (перезапись, если необходимо) и разделяемых библиотек;
— возможность и степень сжатия дистрибутива;
— возможность создания дистрибутива, состоящего из одного, или заданного количества файлов;
InstallShield (Install Shield Corp.), Wise InstallMaster Setup (Wise Solutions), Factory (Indigo Rose Corp.), Ghost Installer Studio; GkSetup (Gero Kuehn), Nullsoft Install System (Nullsoft), GP-Install (Quality Software Components), Little Setup Builder (https://www.ammasw.eboard.com), Inno Setup (https://www.gentee.com), Setup Generator (https://www.jrsoftware.org), Ghost Installer (https://www.ginstall.com).
Редакторы ресурсов
Создают и обрабатывают файлы ресурсов, которые после обработки могут быть скомпилированы и включены в исполнимый модуль. Эти программы специфичны для платформы Win.
— состав поддерживаемых ресурсов;
— возможность работы с нестандартными ресурсами;
— возможности импорта и экспорта ресурсов.
Borland Resource Workshop, eXe Scope, Resource Builder (SiComponents), Resource Explorer (https://batry.hypermart.net).
Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:
Источник: studopedia.ru
Создание инсталлятора
Аннотация: Лекция носит факультативный характер. Здесь мы рассмотрим создание инсталляционного файла для нашей программы, изучим работу с системой Inno Setup.
Цель лекции
На лекции осваиваются приемы разработки инсталляционного файла нашей программы.
Зачем нужны инсталляторы
Наш курс подходит к концу. Мы написали множество проектов, научились делать справку и подключать её к программе, но хотелось бы ещё какие-то из проектов опубликовать в Сети! А что для этого требуется? Установочный файл . Кстати, если вы будете писать программы на заказ, то создание инсталлятора почти наверняка будет обязательным условием проекта.
Как создать свой инсталлятор? Smart Install Maker
Казалось бы, можно обойтись каким-нибудь популярным архиватором вроде WinRAR, сделать на нем самораспаковывающийся SFX-архив, прописать, какой файл программы куда должен быть распакован. Однако так вы получите лишь примитивный инсталлятор, в котором пользователю не предоставляется никаких возможностей выбора, а это плохо — даже если пользователь при установке программ обычно использует все настройки » по умолчанию», нажимая только кнопки «Далее» или «Next», ему нравится осознавать, что от него что-то зависит, что он имеет возможность выбора.
Предположим, ваш проект достаточно сложен, содержит десятки файлов. Вы желаете, чтобы пользователь имел выбор способа установки вашей программы: куда устанавливать, нужно ли создавать ярлыки на рабочем столе и в панели быстрого запуска? Устанавливать ли полную версию, выборочную или минимальную?
Регистрировать ли программу в реестре или создать INI- файл ? Кроме того, пользователь может когда-нибудь захотеть эту программу удалить со своего ПК, а значит, нужно предусмотреть и обратный процесс — деинсталляцию. Все эти операции сделать в обычном архиваторе будет невозможно, или, по крайней мере, чрезвычайно сложно. Зато эти же операции легко создаются в специальных программах-инсталляторах, которые входят в группу утилит программиста. О них и будем говорить на этой лекции.
Обзор инсталляторов
Некоторые среды разработки программ имеют в своем составе инсталляторы. Так, в состав Delphi входит бесплатный инсталлятор Install Shield Express, который, кстати, можно скачать с сайта производителя. Считается, что если в состав IDE входит инсталлятор, то для создания инсталляционного файла (или CD) лучше пользоваться им. Install Shield Express, например, имеет очень удобную функцию включения в инсталляционный пакет «движка» баз данных BDE , который, впрочем, уже устарел, и теперь практически не используется. Ничего другого выдающегося у Install Shield Express не наблюдается, поэтому даже Delphi-программисты предпочитают более «продвинутые» инсталляторы.
Lazarus вообще не имеет в своем составе подобной утилиты, однако существует множество инсталляторов сторонних разработчиков — как платных, так и бесплатных, с помощью которых Lazarus-программист может создать инсталляционный файл или даже загрузочный CD/DVD.
Какие ещё инсталляторы существуют? Их множество: Setup Factory , Visual Studio Installer, Nullsoft Install System , Smart Install Maker и много-много других.
Особо хотелось бы выделить один из самых популярных бесплатных инсталляторов, обладающих широкими возможностями — Inno Setup . Это система создания инсталляторов для Windows -программ. Inno Setup появился в 1997 году и является не просто бесплатным, но и открытым проектом ( Open Source), превосходит многие коммерческие установщики по функциональности и стабильности. Мы будем рассматривать создание инсталляторов на основе Inno Setup .
Inno Setup можно скачать с сайта производителя, официальная страничка: http://www.jrsoftware.org/isinfo.php
Или же, вы можете скачать эту программу с моего сайта:
Следует заметить, что при написании курса рассматривалась версия Inno Setup 5.5.4, а они достаточно часто обновляются. Так что на сайте производителя, возможно, вы найдете более свежую версию.
Файл лицензии
Обычно при установке какой либо программы, пользователю вначале предлагается прочитать и принять лицензионное соглашение (лицензию) программы. Пользователь читает (или чаще, не читает) лицензию, устанавливает радиокнопку с надписью «Я принимаю условия» (или что-то аналогичное), после чего становится доступной кнопка «Далее». Наверное, наш инсталлятор должен также выводить какую то лицензию? Где её взять, или как её сделать, не будучи юристом?
Тут совет простой: найдите схожую с вашей программу, и используйте текст её лицензии, переделав лишь название программы, копирайта (того, кому принадлежит авторское право ), номер версии, и т.п. То есть, если вы собираетесь опубликовать в Интернете вашу программу, как бесплатную ( freeware ), то и лицензию копируйте у другой бесплатной программы. Поскольку все лицензии имеют примерно одинаковые предлагаемые условия и используют одинаковую терминологию, то ничего страшного в данной хитрости нет. Создайте обычный текстовый файл с текстом лицензии, например, в стандартном Блокноте. Мы рассмотрим создание инсталлятора для нашего Блокнота-шифровальщика из лабораторной работы «Блокнот — шифратор» , поэтому и файл с лицензионным соглашением должен быть об этой программе. Назовите файл License.txt (так обычно называют файлы с лицензией), а текст этого файла может быть примерно таким:
«CodeBook» (Блокнот-шифровальщик)
Copyright (c) 2014, В.Ю. Ачкасов
Источник: intuit.ru
Создаем инсталлятор.
Хотел бы рассказать о построении полноценных инсталляторов с помощью подручных сред программирования. Обычно задача создания инсталлера сводится к использованию различных программ (типа Nsis, Inno и т.д.), в которых, как правило, есть свой встроенный скриптовый язык. Но: 1) специфические скрипты изучать нет особого желания; 2) функциональность инсталляторов все же несколько ограниченна в плане возможностей по управлению средствами ОС, хотя при распаковке очень большого количества файлов использование скриптовых систем может быть более выгодным.
Я расскажу об одном способе, который основан на использовании ресурсов, «подшиваемых» к исполняемому файлу. Хотя этот способ и известен в среде программистов, однако далеко не все им владеют.
Что такое ресурс? В том смысле, в котором это слово нам понадобится, ресурс – это совокупность данных, которые непосредственно не относятся к исполняемому коду, но включаются в файл и несут вспомогательные функции. Для ресурсов выделяется отдельная секция в исполняемом файле. Изображения, строки, звуки и анимации, пиктограммы – это все примеры ресурсов.
Сведения о файле (имя программы, версия, разработчики, авторские права) – это тоже ресурсы (строкового типа). Для просмотра ресурсов исполнительных файлов можно воспользоваться программами типа ResHacker.
От теории переходим теперь к практике. Я покажу пример написания инсталлера в среде Borland Delphi. Суть данного способа – «засунуть» распаковываемые файлы в файл ресурсов (RES-файл), который затем подключается к программе на стадии компиляции в среде Delphi. В примере, описанном ниже, распаковывается пять JPEG-картинок (index1.jpeg, . index5.jpeg) в каталог, который выбирает пользователь. Процесс создания представлен совокупностью шагов.
Шаг 1. Надо создать файл (пусть это будет Install.rc), в котором специальным образом перечислены распаковываемые файлы. Файл этот выглядит следующим образом:
Код: Скопировать в буфер обмена
Index1 EXEFILE Index1.jpeg Index2 EXEFILE Index2.jpeg Index3 EXEFILE Index3.jpeg Index4 EXEFILE Index4.jpeg Index5 EXEFILE Index5.jpeg
Тут первый идентификатор обозначает имя (псевдоним) для ресурса, под которым ресурс будет виден программе. Второй параметр – тип ресурса, у нас должно быть EXEFILE. Третий параметр обозначает имя файла.
Шаг 2. Созданный на предыдущем этапе файл Install.rc нужно теперь передать в качестве единственного параметра компилятору ресурсов brcc32.exe, который находится в папке Bin – найти его не сложно. Желательно скопировать в одну папку сам brcc32.exe, скрипт Install.rc и файлы, которые будем паковать (у нас это JPEG-картинки). Затем запускаем в консоли команду
Код: Скопировать в буфер обмена
brcc32.exe Install.rc
. На выходе получается файл Install.res. Это и есть нужный нам файл. Копируем его в папку с проектом инсталлятора на Delphi.
Шаг 3. Работаем с проектом на Delphi. Полученный ресурсный файл Install.res надо подключить к нашей программе, и делается это путем вставки директивы в главный файл проекта – у нас в примере это файл Project1.dpr.
Теперь пишем процедуру для извлечения исходных файлов из ресурсов программы. Возможная реализация такой процедуры может иметь следующий вид:
Код: Скопировать в буфер обмена
procedure ExtractRes(ResType,ResName,ResNewName:String); var Res:TResourceStream; begin Res:=TResourceStream.Create(hInstance,Resname,Pchar(ResType)); Res.SavetoFile(ResNewName); Res.Free; end;
Формальные параметры этой процедуры имеют следующий смысл:
ResType – тип извлекаемого ресурса, для нас это EXEFILE;
ResName – идентификатор ресурса в программе, см. описание структуры файла Install.rc;
ResNewName – полный путь к файлу, в который и будет переписан этот ресурс.
Непосредственно для работы с ресурсом используется встроенный класс системы Delphi – TResourceStream, который и обеспечивает всю «грязную» и рутинную работу с ресурсом. В VC++, кстати, такой роскоши нет, и для работы с ресурсами пришлось бы использовать WinApi-функции. Извлечение файлов с помощью процедуры ExtractRes осуществляется примерно так:
Код: Скопировать в буфер обмена
procedure Extract; begin with Form1 do begin ExtractRes(‘EXEFILE’,’Index1′,PathEdit.Text+’Index1.jpeg’); ExtractRes(‘EXEFILE’,’Index2′,PathEdit.Text+’Index2.jpeg’); ExtractRes(‘EXEFILE’,’Index3′,PathEdit.Text+’Index3.jpeg’); ExtractRes(‘EXEFILE’,’Index4′,PathEdit.Text+’Index4.jpeg’); ExtractRes(‘EXEFILE’,’Index5′,PathEdit.Text+’Index5.jpeg’); end; end;
Процедура Extract извлекает все файлы в папку пользователя. Подробности по визуальному оформлению проекта, естественно, здесь опускаются, так как, скорее всего, это дело личного вкуса.
Ниже в RAR-архиве приложен описанный проект в полностью рабочем состоянии. Пишите в случае возникновения вопросов. Также даю скриншот того, что получилось в результате (Screen.JPG).
(C) siryksv, 2009-2010.
Вложения
Installer.rar
679,2 KB · Просмотры: 560
24,6 KB · Просмотры: 637
siryksv
Участник форума
Регистрация 5 Окт 2009 Сообщения 567 Благодарности 1 Баллы 225
Хотелось бы узнать, нужно ли развивать эту тему? Я мог бы описать создание инсталлера, используя те же ресурсы, но на VC++ (только уже не используя классы Delphi, а на чистом WinApi 8)). Также можно бы рассмотреть вопросы работы с реестром в системе Delphi (а также и через WinApi), создания деинсталлирующей программы, создания ярлыков и т.д. Что скажете?
Wallerstein
Участник форума
Регистрация 26 Апр 2009 Сообщения 965 Благодарности 23 Баллы 195
Интересно бы узнать, а это может чем-нибудь помочь в модостроении или нет?
siryksv
Участник форума
Регистрация 5 Окт 2009 Сообщения 567 Благодарности 1 Баллы 225
Wallerstein
Моды инсталлировать. А если по-сути, то ведь раздел «Программирование» к теме модостроения имеет довольно таки отдаленное отношение. В шапке темы написано:
Программирование Обсуждение вопросов, связанных с программированием на различных языках.
GeorG
Участник форума
Регистрация 27 Авг 2008 Сообщения 3.448 Благодарности 11 Баллы 295
Интересно бы узнать, а это может чем-нибудь помочь в модостроении или нет?
Может и помочь. если ты выше указанным способом, все файлы от ресурсов игры, запихаешь в ресурсы одного exe файла. Можно таким способом сделать инсталлятор. ихмо, только это очень тяжело
siryksv
Прикольная, темка. я лет 5 назад, эту инфу по крупицам собирал Млин. прям ностальгия
siryksv
Участник форума
Регистрация 5 Окт 2009 Сообщения 567 Благодарности 1 Баллы 225
Продолжу тему создания инсталляторов. Может быть, кому-то и понадобится.
Итак, создание инсталлятора на Visual C++.
Для написания примера я использовал «классический» VisualC++ 6, хотя технология создания данной программы под другими версиями компилятора (например, 2003-й) особо ничем не будет отличаться.
Шаг 1. Создадим пустой MFC-проект (File->New->MFC AppWizard (Exe)) с названием VCInstall. Так как нам, в принципе, понадобится одно окно, то в процессе работы мастера выбираем тип приложения Dialog based. Все остальные настройки можно оставить по умолчанию. Оформление окна инсталлятора я оставляю на совесть пользователя, то что у меня самого получилось, видно на скрине в приложениях. Однако, самый главный компонент нашей формы – это кнопка с надписью «Установить» .
Шаг 2. Добавляем ресурсы. Для этого выбираем в главном меню Insert->Insert Resource (или Ctrl+R) и нажимаем кнопку Import, чтобы импортировать ресурс. В появившемся окне выбираем необходимые файлы, кроме того следует также отключить автоопределение ресурса путем переключения пункта «Open As» на значение «Custom». После выбора импортируемых файлов, средой будет выдан запрос на указание типа ресурсов.
В появившемся окне Resource Type следует ввести вводим «EXE» (без кавычек). Будет создан новый ресурс типа «EXE», или множество ресурсов, если были выбраны несколько файлов. Редактирование свойств ресурса и изменение его идентификатора осуществляется путем щелчка правой кнопки мыши (я не левша. ) и выбора меню Properties. В моем примере распаковывается три картинки JPEG.
Скопируем их в подпапку res нашего проекта, а затем импортируем в проект вышеописанным способом. Должны появиться три новых ресурса типа » EXE» с идентификаторами IDR_EXE1, IDR_EXE2, IDR_EXE3. Для удобства можем изменить значения этих идентификаторов на более удобные: пусть это будут INDEX1_RES, INDEX2_RES и INDEX3_RES.
Шаг 3. Процедура извлечения ресурсов.
Напишем функцию извлечения ресурса, используя Api-функции. Указанная функция может будет иметь приблизительно такой вид.
Код: Скопировать в буфер обмена
bool ExtractResource(HINSTANCE hInstance,LPCTSTR lpName,LPCTSTR lpType,char* Destination) < HRSRC Res; HGLOBAL hGlb; char * buff; HANDLE hFile; DWORD temp; if (!(Res=FindResource(hInstance,lpName,lpType)))return FALSE; if (!(hGlb=LoadResource(hInstance,Res)))return FALSE; buff=(char*)LockResource(hGlb); if (!(hFile=CreateFile(Destination,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL))) < FreeResource(hGlb); return FALSE; >WriteFile(hFile,buff,SizeofResource(hInstance,Res), CloseHandle(hFile); FreeResource(hGlb); return TRUE; >
Функция ExtractResource имеет четыре формальных параметра: «сущность» (дескриптор экземпляра модуля) hInstance, в которой находится искомый ресурс, имя ресурса lpName, тип ресурса lpType, и имя файла, куда будет распакован ресурс – параметр Destination. Api-функция FindResource пытается найти ресурс с указанным именем и типом ресурса в модуле, определяемом переменной hInstance , и в случае удачного исхода, возвращает дескриптор ресурса – это переменная Res типа HRSRC.
Дело в том, что ресурс можно в память загрузить только после того, как он будет найден. Собственно загрузка ресурса в память производится функцией LoadResource, которая возвращает дескриптор глобального блока памяти hGlb.
Переменная hGlb – это переменная, скорее нужная самой ОС для идентификации блока памяти, в который загружен ресурс (в самой ОС есть таблицы блоков памяти, где ведется учет всех свободных и занятых блоков), чем для нас. Система может перемещать блоки или выгружать на диск в файл подкачки.
И чтобы не случилось неприятной ситуации, когда некоторая программа работает с ресурсом в оперативной памяти, в то время как система пытается его выгружать (или уже выгружает), ресурс надо зафиксировать в памяти. Для этой цели имеется Api-функция LockResource, которая блокирует ресурс, загруженный в память, и возвращает указатель на адрес начала блока памяти, в котором хранится этот ресурс.
Остается теперь только скопировать содержимое памяти в файл. Для работы с файлами средствами WinApi надо получить дескриптор файла, и для этого существует функция CreateFile. Кстати говоря, эта функция универсальна, и позволяет работать не только с файлами в обычном смысле этого слова, но также и из реальными и виртуальными устройствами, COM, LPT, USB — портами и т.д.
Функция имеет довольно много параметров, все их описывать достаточно скучно, однако замечу, что флаг GENERIC_WRITE говорит, что мы намерены записывать информацию в файл, а CREATE_ALWAYS – файл будет всегда создаваться заново. Другие возможные значения флагов можно посмотреть в справочнике (Р. Саймон, Справочник по WinApi; или Д. Рихтер, Программирование на WinApi для профессионалов). После удачного получения дескриптора файла записываем информацию функцией WriteFile, и освобождаем полученные системные ресурсы. Как видим, все довольно просто.
Функция ExtractResource выполняет «грязную» работу по извлечению ресурса (любого типа и из любого модуля). Мы напишем функцию, которая облегчает доступ к функции ExtractResource, автоматически заполняя некоторые параметры, передаваемые в ExtractResource. Назовем эту функцию ExtractFileExe.
Код: Скопировать в буфер обмена
void ExtractFileExe(char* Dir,char*Name,int Res) < char buff[MAX_PATH]; wsprintf(buff,»%s\%s»,Dir,Name); if (!ExtractResource(GetModuleHandle(NULL),MAKEINTRESOURCE(Res),»EXE»,buff)) < char temp[MAX_PATH]; wsprintf(temp,»Ошибка извлечения файла %s»,Name); AfxMessageBox(temp,MB_OK|MB_ICONERROR); >>
Функция ExtractFileExe имеет три параметра: директорию, куда будет распакован файл, имя, которое будет дано файлу, и числовой идентификатор ресурса в программе. Тут заслуживает внимания макрос MAKEINTRESOURCE – он позволяет по числовому идентификатору ресурса в программе получить его символьное имя, которое затем должно быть передано функции поиска ресурса FindResource. Api-функция GetModuleHandle с параметром NULL позволяет получить дескриптор нашего главного (и единственного в программе) модуля.
Таким образом, оператор
Код: Скопировать в буфер обмена
ExtractFileExe(path,»index1.jpeg»,INDEX1_RES)
извлечет ресурс с числовым идентификатором INDEX1_RES и сохранит его в файл index1.jpeg, путь к которому определяет строка path.
Полностью рабочий пример находится в архиве VCInstall.rar.
(C) siryksv, 2009-2010.
Источник: worldofplayers.ru