Как сделать из msi в exe


Как сделать из msi в exe

Как сделать из msi в exe

Как сделать из msi в exe



Так получилось что надоело мне бегать и на всех компах устанавливать одно и то же ПО и потом его же обновлять. Посему пришлось задаться вопросом об автоматизации данного процесса с помощью групповых политик домена. Малость поизучав данный вопрос оказалось что требуются не абы какие инсталляшки а в формате MSI. Посвятив данному вопросу толику времени и крови я решил составить памятку как для себя так и для других нуждающихся в этом, показав как создать MSI пакет на примере Far Manager.

В качестве инструмента для создания MSI пакета я выбрал набор утилит MAKEMSI, консольный, с очень ужасным языком конфигурирования, но зато бесплатен и позволяет автоматизировать процесс обновления дистрибутива. Инсталляшка, в качестве примера которую я тут приведу по виду неказиста и некрасива, но работает, причем так как мне надо.
Если кто захочет чего то добавить или пояснить, всегда буду рад чужому мнению и совету.
Да, автор конечно не несет никакой ответственности за ущерб причиненный в результате применения моих советов, ни за смерть не накормленной кошки, ни за развод с неудовлетворенной женой, ни за выкинутый в окно монитор, статья для русских и по- русски, так что голову имейте на плечах :-) .
Итак, взяв с собой руки, мозги и бутылку чая идем на сайт программы , качаем архив , распаковываем устанавливаем, перезагружаем комп (так рекомендует руководство), малость изучаем.
Сама по себе программа хоть и консольная но в контекстное меню проводника пихает различные пункты, в том числе и команду компиляции пакета, сама команда выглядит примерно так:

Code:

"C:\WINDOWS\system32\WSCRIPT.EXE" "C:\bin\MakeMsi\_MM.VBS" "Мой пакет.mm" P что не впечатляет, посему проще компилировать пакет щелкая правой кнопкой по исходнику и выбирая пункт "Build MSI - Production". Редактировать исходники удобнее всего конечно в Far'е :-). Впрочем команду можно повесить на Enter по расширению. Или создать BAT файл следующего содержания:

Code:

@echo off "%SYSTEMROOT%\system32\WSCRIPT.EXE" "%MAKEMSI_DIR%\_MM.VBS" "Мой пакет.mm" P Сами исходники пакета состоят как минимум из двух файлов с расширением .mm и расширением .ver, при создании пакета компилятор требует наличия двух файлов с этими расширениями и одинаковыми именами. Файлы .ver содержат служебную информацию о пакете, а файлы .mm собственно описание самой процедуры инсталляции. Подробно описывать язык описания не буду, кому надо на примерах и документации изучит.
Установив инструмент ставим Far Manager, настраиваем его на свой вкус и цвет, начиняем его любимыми плагинами и плюшками. После чего где нибудь создаем папу проекта. В корне проекта создаем каталог files в нем каталог dist и в последний копируем все из каталога куда мы установили Far.
В корне проекта создаем файл Far.ver, куда записываем следующий текст:

Code:

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ProductName = Far Manager ; DESCRIPTION = Консольный файловый менеджер для ОС семейства Windows. ; Installed = WINDOWS_ALL ; Guid.UpgradeCode = {CB7FF333-B93B-7D45-8E31-0F2A698482E7} ; Licence = files\dist\License.xUSSR.rtf ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ VERSION : 1.75.2587 DATE : 2009-06-06 CHANGES : . собственно в языке описания комментарии начинаются с точки запятой, но в данном случае закомментированные переменные ProductName, DESCRIPTION, Installed, Guid.UpgradeCode, Licence - являются определением атрибутов пакета: собственно имени продукта, комментария, платформы для установки, GUID для обновления, и файл лицензий. Строку с файлом лицензии можно и удалить, без нее пакет тоже неплохо формируется и ставится. Лицензия должна быть именно в формате RTF. Guid.UpgradeCode определяет уникальный идентификатор пакета и используется при обновлении пакета, т.е. можете изменить или оставить его как у меня. Пакеты с одинаковым Guid.UpgradeCode но разными версиями будут переустанавливать друг друга а не просто ставиться рядом.
Атрибут VERSION задает версию пакета, DATE дату выпуска, а атрибут CHANGES определяет изменения в текущей версии, сам по себе он не всегда нужен, но компилятор требует его наличия, посему пришлось поставить точку в его содержании.
Чуток о языке описания, прежде всего в нем кавычками являются следующие символы: " ' ^ т.е. строка может выглядить так: ^пример "сильно 'закомментированного' текста"^
Хотелось бы отметить, что конструкциями #( и #) в тексте программы выделяются блоки, и даже пишутся своеобразные процедуры. Процедуры выглядят так:

Code:

#( #define ИмяПроцедуры Комманда1 ... КоммандаN"{$АргументПроцедуры1}' ... КоммандаM "{$АргументПроцедурыN}' ... КоммандаX #) вызывается такая процедура в дальнейшем так:

Code:

<$ИмяПроцедуры АргументПроцедуры1="чего то" АргументПроцедуры2="чего то" .... АргументПроцедурыN="чего то"> Если нужно задать значение аргумента по умолчанию, то достаточно делается это внутри процедуры таким образом:

Code:

КоммандаN"{$АргументПроцедуры1=^Значение по умолчанию^}' при первом упоминании самого аргумента.
Теперь перейдем к файлу Far.mm с описанием процедуры инсталляции, поочередно вписываем в него следующее:

Code:

;---------------------------------------------------------------------------- ; MODULE NAME: FAR.MM ;---------------------------------------------------------------------------- просто комментарий, без аналогичного комментария в начале файла Colorer-take почему то некрасиво раскрашивает содержимое :-)

Code:

#define UISAMPLE_REDUCED_UI_VALUE 1 Данная строка устанавливает режим инсталляции без вопросов, по умолчанию, если вам не нужно что бы пакет сам все поставил куда ему сказали и как сказали, до закомментируйте или удалите строку.

Code:

#define? DEPT_NAME Евгений Рошал #define? DEPT_ARP_URL_PUBLISHER http://farmanager.com #define? DEPT_ARP_URL_TECHNICAL_SUPPORT http://forum.farmanager.com #define? DEPT_ADDRESS Far Group #( #define? UISAMPLE_LEFTSIDE_TEXT Developed by <$DEPT_NAME>. #) #define COMPANY_COMPLETE_FEATURE_TITLE Far Manager #define COMPANY_COMPLETE_FEATURE_DESCRIPTION Консольный файловый менеджер для ОС семейства Windows. Собственно ряд констант, используемых интерфейсом установщика, так же данная информация попадает в поля описания самого пакета MSI.
Тут DEPT_NAME - автор программы, DEPT_ARP_URL_PUBLISHER - сайт разработчика, DEPT_ARP_URL_TECHNICAL_SUPPORT - сайт поддержки, DEPT_ADDRESS - где изготовлено, UISAMPLE_LEFTSIDE_TEXT просто используется в интерфейсе.
COMPANY_COMPLETE_FEATURE_TITLE и COMPANY_COMPLETE_FEATURE_DESCRIPTION определяют название и описание самой инсталляшки и будет отображаться в дальнейшем в виде корня при выборе опций пакета.
Подключает файл с описанием макросов и процедур, задает простейший шаблон инсталляшки.

Code:

<$DirectoryTree Key="INSTALLDIR" Dir="[ProgramFilesFolder]\Far" CHANGE="\" PrimaryFolder="Y"> Определяем переменную INSTALLDIR, куда будет помещен выбранный каталог установки, и задаем значение по умолчанию каталог "%SYSTEMDIR%\Program Files\Far".

<$CodePage "1251">

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

Code:

<$Files "files\dist\." SubDir="TREE" DestDir="[]"> Здесь мы говорим компилятору что файлы из каталога files\dist должны быть установлены в выбранный каталог, фраза SubDir="TREE" указывает, что в выбранный каталог надо копировать всё с подкаталогами. Таких директив может быть несколько, указывающих разные источники, и порой с разными целевыми каталогами.
Собственно это и есть уже готовый дистрибутив, откомпилировав его вы получите инсталляшку которая скопирует файлы куда вы ей скажете. Теперь о мелочах которые делают жизнь приятнее,
Ярлыки в главном меню:

Code:

<$Component "Shortcuts" Create="Y" Directory_="[INSTALLDIR]"> Создаем новую компоненту с названием Shortcuts (можно ставить любое) и привязываем его к каталогу инсталляции, что будет играть роль при обновлении пакета.

Code:

<$DirectoryTree Key="MY_SHORTCUT_FOLDER" Dir="[ProgramMenuFolder]\Утилиты\Far Manager" MAKE="Y" REMOVE=Y"> тут мы создаем переменную где записан путь каталога с ярлыками в главном меню, мне удобнее все приложения группировать, посему я поместил ярлыки в группу Утилиты.

Code:

#( <$Shortcut Dir="[MY_SHORTCUT_FOLDER]" Target="[INSTALLDIR]\far.exe" Title="Far Manager" ; Icon="[INSTALLDIR]\far.ico" WorkDir="[INSTALLDIR]" HotKey="&H0646" > #) Это, собственно, создание ярлыка на исполняемый файл. с определением иконки и комбинации клавиш для быстрого вызова "Ctrl+Alt+F".

Code:

#( #define CreateLNK <$Shortcut Dir="[MY_SHORTCUT_FOLDER]" Target="[INSTALLDIR]\{$FNAME}" Title="{$LNAME}" WorkDir="[INSTALLDIR]" > #) Здесь описана процедура для создания остальных ярлыков, что позволит нам сберечь количество строк в программе :-)

Code:

<$CreateLNK FNAME="Readme.txt" LNAME="Readme"> <$CreateLNK FNAME="SaveSettings.bat" LNAME="Сохранение настроек"> <$CreateLNK FNAME="RestoreSettings.bat" LNAME="Восстановление настроек"> <$CreateLNK FNAME="Far.url" LNAME="Сайт Far Manager в Интернете"> Создаем дополнительно еще четыре ярлыка, в купе с ссылкой на сайт Far'а. Сам URL файл прост, и содержит всего две строки:

Code:

[InternetShortcut] URL=http://farmanager.com/ Чем очень сильно смахивает на INI файл, посему не будем утруждать себя его созданием поручив инсталлятору создать его за нас:

Code:

<$IniFile "Far.url" DIR="[INSTALLDIR]"> <$IniSection "InternetShortcut"> <$Ini "URL" Value="http://farmanager.com/"> <$/IniSection> <$/IniFile> Ну и в последним мы создадим ярлык для удаления программы:

Code:

; Определим процедуру создания ярлыка деинсталляции #( #define UninstallShortcut #if ['{$LOGO=^N^ $$UPPER}' = 'Y'] #define+ @@CU Y #define+ @@LM N #elseif #define+ @@CU N #define+ @@LM Y #endif #if ['{$Maint=^Y^ $$UPPER}' = 'N'] #define+ @@What Uninstall #define+ @@WhatSwitch /x #elseif #define+ @@What Maintain #define+ @@WhatSwitch /i #endif <$Component "UninstallShortcut" Create="Y" Directory_="<$AnyDir>" LM="<$@@LM>" CU="<$@@CU>"> #( <$Shortcut Dir="[{$SCDIR}]" Title="{$SCNAME='Uninstall'}" Icon="{$Icon=^.\<$@@What>Shortcut.ico^}" Target="[System64Folder]msiexec.exe" Arguments=^<$@@WhatSwitch> [ProductCode] {$Args=''}^ Description=^{$ToolTip=<$@@What>s <$ProdInfo.ProductName> version <$ProductVersion>}^ > #) <$/Component> #) ; Создадим ярлык деинсталляции программы :-) <$UninstallShortcut SCDIR="MY_SHORTCUT_FOLDER" Icon="@files\dist\UnInstall.ico" SNAME="Деинсталировать Far" MAINT='N'> Не пугайтесь, весь этот кусок действительно посвящен всего одному ярлыку, причем он был рекомендован автором MAKEMSI.
ну и осталось только закрыть блок создания ярлыков: В принципе на этом можно было бы закончить, но устанавливаемый Far имеет вкус и цвет по умолчанию, что не всем нравится, посему мы заставим инсталлятор внести все необходимы изменения в реестр:

Code:

; Определим процедуру внесения записей в реестр в ветку LOCAL_MACHINE #( #define rHLKM <$Registry HKEY="LOCAL_MACHINE" KEY="{$KEY}" NAME="{$NAME}" VALUE=^{$VALUE}^ TYPE="{$TYPE='STRING'}" KEYPATH="Y" MsiFormatted="VALUE" > #) ; Внесем различную информацию в реестр <$rHLKM KEY="Software\Far" NAME="Path" VALUE="[INSTALLDIR]"> <$rHLKM KEY="Software\Far\Registration" NAME="Data" TYPE="BINARY" VALUE="21,38,23,53,7f,7e,7f,7d,0e,d1,95,90,9a,d4,d6,d7,96,df,90,d4,98,93,dd,95,de,a4,e1,a6,af,e9,a1"> В принципе таким макаром можно и все настройки внести, но инструмент позволяет импортировать в инсталляшку записи реестра из Reg файла. Сохраним настройки Far'а при помощи входящего в его состав скрипта SaveSettings.bat, возьмем файл FarSave1.reg, очистим его от мусора, от всего что имеет нестатические пути (их в случае необходимости внесем вручную), положим его, скажем, в каталог files\options и продолжим нашу программу следующей строчкой:

Code:

<$RegistryImport "files\options\FarSave1.reg" CURRENT_USER="" LOCAL_MACHINE="" CLASSES_ROOT=""> компилятор сам преобразует файл реестра и включит в программу все необходимое.
Тут надо сказать, что я наткнулся на первый камень, который не смог обойти. Если в имени ключа есть двойная или одинарная кавычка, то компилятор на этом ключе будет вываливаться с ошибкой. Не зависимо от того как вы его добавляете, строкой в программе или импортируете из файла. Мне пришлось убрать определение макроса повешенные на клавиши Alt+" и Alt+', если кто найдет способ как такие строки включить в программу буду признателен.
В принципе на этом можно закончить, но можно расширить свой дистрибутив с возможностью их выбора во время инсталляции. Для начала возьмем плагин от 7-Zip к Far'у и поместим его в каталог files\addonsz и заставим программу настроить MultiArc и фар на работу с архиватором 7z добавив следующее:

Code:

<$Feature "plugins" Title="Плагины" Description="Различные плагины улучшающие и облегчающие работу в Far Manager."> ; Плагин 7-Zip <$Feature "plugin7z" Title="Плагин 7-Zip" Description="Этот модуль FAR позволяет работать с архивами. Для пользователя файлы в архивах не отличаются от файлов в папках."> <$Files "files\addonsz\." SubDir="TREE" DestDir="[INSTALLDIR]\Pluginsz"> ; Узнаем каталог архиватора 7-Zip, если оный еще не установлен, то зададим каталог по умолчанию #( <$RegistryRead Property="PATH7Z" HKEY="LOCAL_MACHINE" Key="Software-Zip" Name="Path" Default="[ProgramFilesFolder]-Zip" > #) <$rHLKM KEY="Software\Far\Plugins\MultiArc\BZIP" NAME="AllFilesMask" VALUE=""> <$rHLKM KEY="Software\Far\Plugins\MultiArc\BZIP" NAME="Extract" VALUE='"[PATH7Z]z" -scsDOS -r0 -y x %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\BZIP" NAME="ExtractWithoutPath" VALUE='"[PATH7Z]z" -scsDOS -y -r0 e %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\BZIP" NAME="Test" VALUE='"[PATH7Z]z" -scsDOS t -y -r0 %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\BZIP" NAME="Delete" VALUE='"[PATH7Z]z" -scsDOS d -y -r0 %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\BZIP" NAME="Add" VALUE='"[PATH7Z]z" -scsDOS -r0 -y -tbzip2 a %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\BZIP" NAME="AddRecurse" VALUE='"[PATH7Z]z" -scsDOS -r0 -y -tbzip2 a %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\CAB" NAME="AllFilesMask" VALUE=""> <$rHLKM KEY="Software\Far\Plugins\MultiArc\CAB" NAME="Extract" VALUE='"[PATH7Z]z" -scsDOS -r0 -y x %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\CAB" NAME="ExtractWithoutPath" VALUE='"[PATH7Z]z" -scsDOS -y -r0 e %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\CAB" NAME="Test" VALUE='"[PATH7Z]z" -scsDOS t -y -r0 %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\GZIP" NAME="AllFilesMask" VALUE=""> <$rHLKM KEY="Software\Far\Plugins\MultiArc\GZIP" NAME="Extract" VALUE='"[PATH7Z]z" -scsDOS -r0 -y x %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\GZIP" NAME="ExtractWithoutPath" VALUE='"[PATH7Z]z" -scsDOS -y -r0 e %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\GZIP" NAME="Test" VALUE='"[PATH7Z]z" -scsDOS t -y -r0 %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\GZIP" NAME="Delete" VALUE='"[PATH7Z]z" -scsDOS d -y -r0 %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\GZIP" NAME="Add" VALUE='"[PATH7Z]z" -scsDOS -r0 -y -tgzip a %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\GZIP" NAME="AddRecurse" VALUE='"[PATH7Z]z" -scsDOS -r0 -y -tgzip a %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\RAR" NAME="Extract" VALUE='"[PATH7Z]z" -scsDOS x -r0 -y {-w%%W} -- %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\RAR" NAME="ExtractWithoutPath" VALUE='"[PATH7Z]z" -scsDOS e -r0 -y {-w%%W} -- %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\RAR" NAME="Test" VALUE='"[PATH7Z]z" -scsDOS t -r0 -scsDOS -- %%A @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\RAR" NAME="AllFilesMask" VALUE="."> <$rHLKM KEY="Software\Far\Plugins\MultiArc\RAR" NAME="DefExt" VALUE="rar"> <$rHLKM KEY="Software\Far\Plugins\MultiArc\TAR" NAME="Extract" VALUE='"[PATH7Z]z" -scsDOS -r0 -y x %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\TAR" NAME="ExtractWithoutPath" VALUE='"[PATH7Z]z" -scsDOS -y -r0 e %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\TAR" NAME="AllFilesMask" VALUE=""> <$rHLKM KEY="Software\Far\Plugins\MultiArc\TAR" NAME="Test" VALUE='"[PATH7Z]z" -scsDOS t -y -r0 %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\TAR" NAME="Delete" VALUE='"[PATH7Z]z" -scsDOS d -y -r0 %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\TAR" NAME="Add" VALUE='"[PATH7Z]z" -scsDOS -r0 -y -ttar a %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\TAR" NAME="AddRecurse" VALUE='"[PATH7Z]z" -scsDOS -r0 -y -ttar a %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\ZIP" NAME="Extract" VALUE='"[PATH7Z]z" -scsDOS [\{]-p%%P[\}] -r0 -y x %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\ZIP" NAME="ExtractWithoutPath" VALUE='"[PATH7Z]z" -scsDOS [\{]-p%%P[\}] -y -r0 e %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\ZIP" NAME="Test" VALUE='"[PATH7Z]z" -scsDOS t [\{]-p%%P[\}] -y -r0 %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\ZIP" NAME="Delete" VALUE='"[PATH7Z]z" -scsDOS d -y -r0 %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\ZIP" NAME="Add" VALUE='"[PATH7Z]z" -scsDOS -r0 -y -tzip a %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\ZIP" NAME="AddRecurse" VALUE='"[PATH7Z]z" -scsDOS -r0 -y -tzip a %%AQ @%%LQMN'> <$rHLKM KEY="Software\Far\Plugins\MultiArc\ZIP" NAME="AllFilesMask" VALUE=""> ; Настроим плагин MultiArc путем редактирования ini-файла ; В принципе статические строки можно внести в ini-файл сразу вручную ; а в инсталляторе внести только динамические строки <$Component "INI" Create="Y" Directory_="INSTALLDIR" LM="Y"> <$IniFile "Custom.ini" DIR="[INSTALLDIR]\Plugins\MultiArc\Formats"> <$IniSection "7z"> <$Ini "TypeName" Value="7z"> <$Ini "ID" Value="37 7A BC AF 27 1C"> <$Ini "IDPos" Value=""> <$Ini "IDOnly" Value="1"> <$Ini "Extension" Value="7z"> <$Ini "List" Value='"[PATH7Z]z.exe" -scsDOS l'> <$Ini "Start" Value='"^--"'> <$Ini "End" Value='"^--"'> <$Ini "Extract" Value='"[PATH7Z]z.exe" -scsDOS {-p%%P} -r0 -y x %%AQ @%%LQMN'> <$Ini "ExtractWithoutPath" Value='"[PATH7Z]z.exe" -scsDOS {-p%%P} -y -r0 e %%AQ @%%LQMN'> <$Ini "Test" Value='"[PATH7Z]z.exe" -scsDOS t {-p%%P} -y -r0 %%AQ @%%LQMN'> <$Ini "Delete" Value='"[PATH7Z]z.exe" -scsDOS d -y -r0 -ms=off %%AQ @%%LQMN'> <$Ini "Add" Value='"[PATH7Z]z.exe" -scsDOS -r0 -y -t7z a %%AQ @%%LQMN'> <$Ini "AddRecurse" Value='"[PATH7Z]z.exe" -scsDOS -r0 -y -t7z a %%AQ @%%LQMN'> <$Ini "AllFilesMask" Value='""'> ; Данная строка не может быть внесена в ini файл средствами MAKEMSI, т.к. её значение слишком длинно, ; но она статическая, что позволяет нам внести её сразу в дистрибутив вручную ;<$Ini "Format0" Value='"yyyy tt dd hh mm ss aaaaa zzzzzzzzzzzz pppppppppppp nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"'> <$/IniSection> <$IniSection "rpm"> <$Ini "TypeName" Value='rpm'> <$Ini "ID" Value='ED AB EE DB'> <$Ini "IDPos" Value=''> <$Ini "IDOnly" Value='1'> <$Ini "Extension" Value='rpm'> <$Ini "List" Value='"[PATH7Z]z.exe" -scsDOS l -- %%AQ'> <$Ini "Start" Value='"^--"'> <$Ini "End" Value='"^--"'> <$Ini "Extract" Value='"[PATH7Z]z.exe" -scsDOS x {-p%%P} -r0 -y -- %%AQ @%%LQMN'> <$Ini "ExtractWithoutPath" Value='"[PATH7Z]z.exe" -scsDOS {-p%%P} -y -r0 e %%AQ @%%LQMN'> <$Ini "Test" Value='"[PATH7Z]z.exe" -scsDOS t {-p%%P} -y -r0 %%AQ @%%LQMN'> <$Ini "Delete" Value='"[PATH7Z]z.exe" -scsDOS d -r0 {-w%%W} -- %%AQ @%%LQMN'> <$Ini "Add" Value=''> <$Ini "AddRecurse" Value=''> <$Ini "AllFilesMask" Value='""'> ; Данная строка не может быть внесена в ini файл средствами MAKEMSI, т.к. её значение слишком длинно, ; но она статическая, что позволяет нам внести её сразу в дистрибутив вручную ; <$Ini "Format0" Value='"yyyy tt dd hh mm ss aaaaa zzzzzzzzzzzz pppppppppppp nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"'> <$/IniSection> <$IniSection "cpio"> <$Ini "TypeName" Value='cpio'> <$Ini "ID" Value=''> <$Ini "IDPos" Value=''> <$Ini "IDOnly" Value='1'> <$Ini "Extension" Value='cpio'> <$Ini "List" Value='"[PATH7Z]z.exe" -scsDOS l -- %%AQ'> <$Ini "Start" Value='"^--"'> <$Ini "End" Value='"^--"'> <$Ini "Extract" Value='"[PATH7Z]z.exe" -scsDOS {-p%%P} -r0 -y x %%AQ @%%LQMN'> <$Ini "ExtractWithoutPath" Value='"[PATH7Z]z.exe" -scsDOS {-p%%P} -y -r0 e %%AQ @%%LQMN'> <$Ini "Test" Value='"[PATH7Z]z.exe" -scsDOS t {-p%%P} -y -r0 %%AQ @%%LQMN'> <$Ini "Delete" Value='"[PATH7Z]z.exe" -scsDOS d -y -r0 -ms=off %%AQ @%%LQMN'> <$Ini "Add" Value=''> <$Ini "AddRecurse" Value=''> <$Ini "AllFilesMask" Value='""'> ; Данная строка не может быть внесена в ini файл средствами MAKEMSI, т.к. её значение слишком длинно, ; но она статическая, что позволяет нам внести её сразу в дистрибутив вручную ; <$Ini "Format0" Value='"yyyy tt dd hh mm ss aaaaa zzzzzzzzzzzz pppppppppppp nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"'> <$/IniSection> <$IniSection "deb"> <$Ini "TypeName" Value='deb'> <$Ini "ID" Value=''> <$Ini "IDPos" Value=''> <$Ini "IDOnly" Value='1'> <$Ini "Extension" Value='deb'> <$Ini "List" Value='"[PATH7Z]z.exe" -scsDOS l -- %%AQ'> <$Ini "Start" Value='"^--"'> <$Ini "End" Value='"^--"'> <$Ini "Extract" Value='"[PATH7Z]z.exe" -scsDOS {-p%%P} -r0 -y x %%AQ @%%LQMN'> <$Ini "ExtractWithoutPath" Value='"[PATH7Z]z.exe" -scsDOS {-p%%P} -y -r0 e %%AQ @%%LQMN'> <$Ini "Test" Value='"[PATH7Z]z.exe" -scsDOS t {-p%%P} -y -r0 %%AQ @%%LQMN'> <$Ini "Delete" Value=''> <$Ini "Add" Value=''> <$Ini "AddRecurse" Value=''> <$Ini "AllFilesMask" Value='""'> ; Данная строка не может быть внесена в ini файл средствами MAKEMSI, т.к. её значение слишком длинно, ; но она статическая, что позволяет нам внести её сразу в дистрибутив вручную ; <$Ini "Format0" Value='"yyyy tt dd hh mm ss aaaaa zzzzzzzzzzzz pppppppppppp nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"'> <$/IniSection> <$/IniFile> <$/Component> <$/Feature> еще я взял плагин PictureView, положил его в каталог files\addons\pictureview, рекомендованную к нему библиотеку libgfl254.dll поместил в каталог files\libs и добавил инсталляшке следующее:

Code:

<$Feature "pics" Title="Плагин PictureView" Description="Плагин позволяет просматривать изображения различных графических форматов непосредственно из Far'а. (В том числе из архивов и виртуальных панелей.)"> <$Files "files\libs\libgfl254.dll" SubDir="TREE" DestDir="[SystemFolder]"> <$Files "files\addons\pictureview\." SubDir="TREE" DestDir="[INSTALLDIR]\Plugins\pictureview"> <$/Feature> и закончил секцию Плагины: Можно добавить возможность инсталляции ряда системных библиотек, таких как msvcp71.dll и msvcr71.dll, которые нужны некоторым плагинам и их почему то порой не бывает на устанавливаемом компьютере, я поместил данные файлы в каталог files\libs\sys и добавил следующее:

Code:

; Ряд системных библиотек <$Feature "syslibs" Title="Системные библиотеки" Description="Ряд системных библиотек, которые требуются некоторым плагинам"> <$Files "files\libs\sys\." SubDir="TREE" DestDir="[SystemFolder]"> <$/Feature> Причем выбор ставить или нет остается за пользователем.
Можно добавить выбора и гибкости к дистрибутиву, Например сделать некоторые части дистрибутива по умолчанию не устанавливаемыми, с возможностью их выбора для установки. Начнем с PluginSDK, переместим его в каталог files\addons\PluginSDK и добавим к нашей программе следующее:

Code:

; PluginSDK <$Feature "PluginSDK" Title="Plugins SDK" Level="5"> <$Files "files\addons\PluginSDK\." SubDir="TREE" DestDir="[INSTALLDIR]\Plugins\PluginSDK"> <$/Feature> Здесь параметр Level="5" у диреткивы Feature отключает по умолчанию данный пункт, те кому надо могут его включить во время инсталляции :-)
Так же можно пступить с документацией, в частности с английской версией, коя нужна далеко не всем при наличии русской, поместим каталог Documentation в директорию files\addons и добавим к программе следующее:

Code:

; Документация <$Feature "docs" Title="Документация" Description="Различная текстовая документация, относящаяся к Far Manager"> <$Feature "docs_eng" Title="Английский" Level="5" Description="Документация на английском языке"> <$Files "files\addons\Documentation\eng\." SubDir="TREE" DestDir="[INSTALLDIR]\Documentation\eng"> <$/Feature> <$Feature "docs_rus" Title="Русский" Description="Документация на русском языке"> <$Files "files\addons\Documentation\rus\." SubDir="TREE" DestDir="[INSTALLDIR]\Documentation\rus"> <$/Feature> <$/Feature> И т.д.
И на последок. Т.к. данные о настройке хранятся в реестре текущего пользователя, все старания с реестром могут быть потерянными при установке Far'а через групповую политику, т.к. ставится он от имени системы, поэтому заставим дистрибутив сохранять настройки после установки добавив в самый конец следующие строки:

Code:

#( <$ExeCa EXE="[SystemFolder]\reg.exe" Args=^export "HKEY_CURRENT_USER\Software\Far" "[INSTALLDIR]\FarSave1.reg"^ CONDITION=^<$VBSCA_CONDITION_INSTALL_ONLY>^ Rc0="N" ;;Не проверяем код возврата Seq="<-InstallFinalize" > #) #( <$ExeCa EXE="[SystemFolder]\reg.exe" Args=^export "HKEY_LOCAL_MACHINE\Software\Far" "[INSTALLDIR]\FarSave2.reg"^ CONDITION=^<$VBSCA_CONDITION_INSTALL_ONLY>^ Rc0="N" ;;Не проверяем код возврата Seq="<-InstallFinalize" > #) и теперь каждый новый пользователь сможет используя ярлык "Восстановление настроек" импортировать все настройки в свой реестр.
Если кому интересно могу чуть позже выложить сам каталог с файлами, готовыми для сборки дистрибутива.
Источник: http://forum.farmanager.com/viewtopic.php?t=4301


Как сделать из msi в exe

Как сделать из msi в exe

Как сделать из msi в exe

Как сделать из msi в exe

Как сделать из msi в exe

Как сделать из msi в exe

Как сделать из msi в exe

Как сделать из msi в exe