Знакомство с InnoSetup
Опубликовано 23.10.2011 г. 00:07
В RAD Studio XE2 как вы, наверное, знаете входит пакет InstallAware 2012 для создания инсталляторов. Поскольку недавно я решил, что надо сделать инсталлятор для OSC Провайдера для Outlook, то я решил немного изучить эту программу. К сожаление знакомство наше с ней не задалось с самого начала. В итоге InstallAware был благополучно удален, а его место занял бесплатный InnoSetup.
InnoSetup имеет весьма маленький объем (инсталлятор 2Мб, устанавливается на ~7Мб), что в отличии от полной установки InstallAware (2Гб, 8Гб) является бесспорным преимуществом. Сама программа кстати написана на Delphi. Мне уже приходилось использовать его на работе, но тогда это была только компиляции скрипта и все. Т.е я не разбирался в принципах его работы. Задача моя была проста, требовалось создать два инсталлятора, один для 32-разрядной версии плагина, и для 64-разрядной. Так что исполняемые файлы для разных версий я соответственно разложил в папки Win32 & Win64. Так же создал папку Common, где пока что находится только один файл шаблонов, но я планирую добавить туда еще утилиту настройки плагина. Окно программы выглядит весьма просто, что в общем то радует. при этом доступна и подсветка синтаксиса, и всплывающие подсказки.

Для автоматизации написания скрипта установки имеется мастер. Я им и воспользовался, в результате чего получил простой скрипт. Файлов инсталляции у меня не много так что скрипт был достаточно маленький. Далее дорабатывать пришлось вручную. Я создал три скрипта: для оффиса32, оффиса64 и общую часть. В чем вообще в таком случае различия? на рисунке выше, показан скрипт win32 без общей части. Во-первых версии плагина под разные платформы будут иметь разные версии. Во-вторых с помощью директивы #define я определил имя папки, где содержатся 32разрядные файлы установки - PlatformDir - Win32. Третье - Предполагаемая директория установки Оффиса в win32 это будет Program files, в вин64 (32битный офис) будет наверняка находиться в Program Files (x86). И наконец, в имя файла установщика я добавил суффикс x32 Соответственно для х64 код скрипта был следующий:

Для автоматизации написания скрипта установки имеется мастер. Я им и воспользовался, в результате чего получил простой скрипт. Файлов инсталляции у меня не много так что скрипт был достаточно маленький. Далее дорабатывать пришлось вручную. Я создал три скрипта: для оффиса32, оффиса64 и общую часть. В чем вообще в таком случае различия? на рисунке выше, показан скрипт win32 без общей части. Во-первых версии плагина под разные платформы будут иметь разные версии. Во-вторых с помощью директивы #define я определил имя папки, где содержатся 32разрядные файлы установки - PlatformDir - Win32. Третье - Предполагаемая директория установки Оффиса в win32 это будет Program files, в вин64 (32битный офис) будет наверняка находиться в Program Files (x86). И наконец, в имя файла установщика я добавил суффикс x32 Соответственно для х64 код скрипта был следующий:
#define MyAppVersion "1.0 (x64)" #define PlatformDir "Win64" [Setup] DefaultDirName={pf64}\Microsoft Office\VkOSCProvider OutputBaseFilename=vkosc_setup_x64 architecturesInstallIn64BitMode=x64 ia64 #include "Common\setup_common.iss";Здесь можно заметить одну дополнительную строку - architecturesInstallIn64BitMode. Смысл ее таков: сама программа инсталлятор все равно является 32битной и это имеет свое значение при запуске ее под win64. При установке программ различия будут например в путях установки, или, например, при регистрации библиотеки. Включение данного параметра переводит программу в нужный режим, и позволяет получать корректные пути и вызывать нужные утилиты для правильной установке 64-битных приложений. Теперь пришло время основной части. Сначала секция констант:
#define MyAppName "ВКонтакте Outlook Social Provider" #define MyAppPublisher "teran" #define MyAppURL "http://teran.karelia.pro" #define CommonDir "Common"и основные параметры установщика секция [Setup]. Настройки языков в секции [Language], но я их не трогал, лишь указал использовать русский язык.
[Setup] AppId={{CE1E40AB-2747-4310-89D5-497ACCF4C02E} AppName={#MyAppName} AppVersion={#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} OutputDir=. DefaultGroupName={#MyAppName} AllowNoIcons=yes Compression=lzma SolidCompression=yes VersionInfoCopyright={#MyAppPublisher} SetupIconFile={#PlatformDir}\setup.ico [Languages] Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"Поскольку символ { является здесь служебным, то для указания самого такого символа как текста используется двойной. Можете видеть этого при указании GUID в AppID. Директория для генерации инсталляторов OutputDir указана текущей. Как вы можете заметить, SetupIconFile зависит от устанавливаемой платформы, что упрощается с использованием определенной константы PlatformDir. Далее можно перейти непосредственно к копированию файлов. За это отвечает секция [Files]. Здесь мы должны указать что и куда мы будем копировать, а также дополнительные с ними действия. Можем использовать маски, и предопределенные константы.
[Files] Source: "{#PlatformDir}\vkProvider.dll"; DestDir: "{app}"; Flags: ignoreversion regserver Source: "{#PlatformDir}\libeay32.dll"; DestDir: "{sys}"; Source: "{#PlatformDir}\ssleay32.dll"; DestDir: "{sys}"; Source: "{#CommonDir}\vkoscptpl.xml"; DestDir: "{app}"; Flags: ignoreversionВсе исполняемые файлы мы берем из папки платформы назначения PlatformDir. Библиотеку vkProvider.dll помещаем в директорию, выбранную при установке - {app}. Указаны два флага ignoreversion указывает на замещение файла не смотря на версию библиотеки. Флаг regserver проводит регистрацию dll. В этом месте при установке 64битной версии, если бы мы не указали ранее architecturesInstallIn64BitMode то получили бы ошибку, поскольку тогда для регистрации 64разрядной версии библиотеки была бы вызвана 32битная версия regsvr. Далее библиотеки для работы в SSL копируются в системную директорию. Опять же без указания 64bitMode, библиотеки были бы скопированы в папку SysWOW64, а не в system32. Здесь также рекомендуется снять флаг ignoreversion, поскольку эти библиотеки могут использоваться разными программами, и в системной папке может быть более новая версия. После того как все файлы скопированы, а библиотека зарегистрирована, можно добавить информацию о провайдере в реестр, чтобы Outlook знал о нем. Опять же определим константу с нужным нам путем в реестре.
#define ProviderKey "Software\Microsoft\Office\Outlook\SocialConnector\SocialProviders\OscAddin.VkProvider" [Registry] Root: HKLM; Subkey: {#ProviderKey}; Flags: uninsdeletekey Root: HKLM; Subkey: {#ProviderKey}; ValueType : string; ValueName : "FriendlyName"; ValueData : "ВКонтакте Social Provider"; Root: HKLM; Subkey: {#ProviderKey}; ValueType : string; ValueName : "ProviderUrl"; ValueData : "http://teran.karelia.pro";Данный путь будет удален при деинсталляции, что задается флагом uninsdeletekey OscAddi.vkProvider - ProgID класса нашего провайдера. По умолчанию в Delphi для COM-объектов он задается как имя-проекта.имя класса. Для изменения данного поведения нам нужно переопределить метод getProgID фабрики, и использовать ее вместо стандартной:
TOSCObjectFactory = class(TComObjectFactory) protected function GetProgID(): string; override; end; .... function TOSCObjectFactory.GetProgID: string; begin result := 'OscAddin.VkProvider'; end; .... initialization TOSCObjectFactory.Create(ComServer, TSocialProvider, Provider_CLSID, 'TSocialProvider', 'Outlook Social Connector Provider', ciMultiInstance, tmApartment);Как вы, наверное, догадались, этот скрипт демонстрирует лишь самую малую часть функционала InnoSetup. Доступны возможности и раскраски инстяллатора, и написания скриптов на Pascal-script и т.д. и т.п. Так что впечатление от использования у меня сложилось весьма хорошее. Просто, удобно и функционально.
09.05.2015 в 13:03
http://www.actualinstaller.ru
Перешел на него как раз с InnoSetup'a