Примечание. В конце статьи есть ссылка на загрузку готового примера проекта
В этой инструкции я познакомлю вас с ещё одной замечательной возможностью SFX Creator, которая недокументирована в силу того, что цель достигается путём логического мышления, да и саму инструкцию я пишу только из-за того, что один из пользователей программы задал вопрос в теме обсуждения SFX Creator на форуме OSZone, а возможно ли создать подобный архив в SFX Creator, который будет сам себя перепаковывать?
Начиная с версии 2.8 RC, SFX Creator может создавать самообновляемые SFX архивы в силу некоторых добавленных возможостей (например, переменной $PROJECT), разберём конкретный пример, что это за архив и зачем такой архив может понадобиться.
Пример надобности, опять же, возьму с сообщения, заданного пользователем SFX Creator:
Небходимо создать архив с программой (рассматривать будем Total Commander, далее TC), после запуска SFX архив распаковывает TC во временную папку, запускает приложение, ждёт его завершения, в программе меняются настройки, программма завершается и наш архив перепаковывается, сохраняя все настройки программы, которые пользователь внёс при работе с программой.
Т.к. TC хранит настройки в папке с программой - нам гораздо проще, не нужно прописывать дополнительных команды, достаточно просто упаковать папку TC
Примечание. Если ваша программа обращается к реестру - в проекте добавляете импорт данных в реестр перед запуском программы и экспорт из реестра после завершения работы вашего приложения
И так, начинаем! :)
Внимание! Следуйте строго инструкции, не вводите свои данные, где об этом не упоминается, иначе у вас ничего не получится!
Главные настройки проекта
Имя проекта: Total Commander_UniSFX (можно выбрать своё, ДОЛЖНО совпадать с именем сохраняемого проекта! (директории с файлами проекта))Директория установки: $TEMP\${PRODUCT_NAME}
Иконка SFX архива: $PROJECT\icon.ico
Сохранить SFX архив в файл: $PROJECT\${PRODUCT_NAME}.exe
Дополнительные настройки проекта
Переходим в Настройки проектаОбязательно ставим галочку Тихая компиляция
Нажимаем кнопку сохранения проекта и вводим Имя проекта с главного окна SFX Creator (в данном примере - Total Commander_UniSFX)
После сохранения проекта сразу же открываем папку проекта, нажав кнопку желтой папки в диалоге Настройка проекта
Добавляем файл иконки, который будет у нашего SFX архива, кидаем файл с именем icon.ico в открытую нами папку проекта
Добавление записей с файлами проекта
Переходим в главное окно SFX Creator и добавляем записи с файлами проекта, вручную вводя данные в поля:Запись 1
$PROJECT\SFX Creator
$INSTDIR\SFX CreatorДополнительные действия:
В папку проекта распаковываем этот архив, это минимальный набор файлов SFX Creator и дистрибутива NSIS (2 Мб), необходимых для скрытой компиляции без использования графических возможностей и SFX Creator, и при создании SFX архива
Этой записью мы добавляем урезанный дистрибутив в наш SFX архив, после работы нашего приложения именной данная копия SFX Creator будет перепаковывать SFX архив
Запись 2
$PROJECT\SFX Creator
$INSTDIR\SFX Creator\projects\${PRODUCT_NAME}\SFX CreatorЭтой записью мы распаковываем урезанный дистрибутив SFX Creator в папку урезанного дистрибутива (каша? ;) ), чтобы при следующей сборке SFX архива урезанная сборка не потерялась
Запись 3
$PROJECT\AppFiles
$INSTDIR\SFX Creator\projects\${PRODUCT_NAME}\AppFilesДополнительные действия:
В папке проекта создаём директорию AppFiles и копируем в неё файлы TC так, чтобы главный файл Totalcmd.exe оказался в самой папке AppFiles
Думаю понятно, добавляем файлы приложения в проект
Запись 4
$PROJECT\icon.ico
$INSTDIR\SFX Creator\projects\${PRODUCT_NAME}Добавляем распаковку файла иконки проекта, чтобы последующие сборки завершились удачно
Запись 5
$PROJECT\Project.ini
$INSTDIR\SFX Creator\projects\${PRODUCT_NAME}Файл проекта, который сейчас у вас активен - тоже пойдёт в архив сразу же в обновлённом виде :)
Запись 6
$PROJECT\Include
$INSTDIR\SFX Creator\projects\${PRODUCT_NAME}\IncludeДополнительные действия:
В папку проекта распаковываем этот архив, это скрипт самоудаления нашего SFX архива и замена его обновленной версией при завершении работы нашего приложения. Скрипт универсальный и в нём прописывать ничего не нужно, прям как вы любите ;)
Запускаем приложение, пересборка архива с заменой обновленной версией
С добавлением файлов мы закончили, переходим в диалог Выполнение приложений и Shell-команда) Первым делом добавляем исполнение нашего приложения:
Тип команды - Приложение
Выполнить после распаковки файлов
Файл на выполнение:
$INSTDIR\SFX Creator\projects\${PRODUCT_NAME}\AppFiles\Totalcmd.exe
б) Добавляем команду на запуск пересборки нашего SFX архива
Тип команды - Приложение
Выполнить после распаковки файлов
Файл на выполнение:
$INSTDIR\SFX Creator\ccode.exeПараметры приложения:
/compile /project=${PRODUCT_NAME}
в) Добавляем команду на удаление старой версии SFX архива и заменяем его новой, пересобрарнной версией
Тип команды - Приложение
Выполнить после распаковки файлов
Файл на выполнение:
$INSTDIR\SFX Creator\projects\${PRODUCT_NAME}\${PRODUCT_NAME}.exeПараметры приложения:
/selfdel=$EXEPATH /dir=$INSTDIRОбязательно ставим галочку Не ждать завершения исполнения
Добавляем исполнение скрипта для самоудаления
5. Переходим в диалог Выполнение собственных NSIS функцийInclude файл: selfdel.nsh
Имя функции: SelfDel
Выполнить до распаковки файлов
Готово!
Если вы всё сделали правильно - архив должен собраться и отрабатывать без ошибок.
Примечание. Выходной файл будет находиться в папке проекта - <SFX Creator>\projects\Total Commander_UniSFX\Total Commander_UniSFX.exe
Готовый пример проекта с программой Total Commander
Вы можете загрузить этот пример проекта по этой ссылке (только без файлов TC)1. Распаковать содержимое архива в папку <SFX Creator>\projects
2. Скопировать файлы Total Commander в папку <SFX Creator>\projects\Total Commander_UniSFX\AppFiles
3. Выходной файл будет находиться в папке проекта - <SFX Creator>\projects\Total Commander_UniSFX\Total Commander_UniSFX.exe