Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Ответить
Настройки темы
.: NSIS - все вопросы :. часть 2.

Аватара для kotkovets

Ветеран


Сообщения: 1216
Благодарности: 486


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: kotkovets
Дата: 07-06-2020
Описание: NSIS 3.05


Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения.


Описание:
читать дальше »
NSIS (Nullsoft Scriptable Install System) - профессиональная система для создания инсталляторов в среде Windows с октрытым исходным кодом. При своем малом размере система очень гибкая, и при с широкими возможностями. Генерируемый ею инсталлятор также имеет очень маленький размер и идеально подходит для распространения продукта через Интернет.


Текущая версия: NSIS 3.05 от 15 декабря 2019 года
Скачать | Архив сборок версии

Первая часть этой темы
Скачать первую часть этой темы одним архивом

ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов:
Справочник по NSIS - создан силами нашего сообщества.
Руководство пользователя. Перевод – Поляков А.В, зеркало

Документация

Утилиты разработчика
Расширение функциональности

Примеры скриптов на нашем форуме
Скрипт NSIS для перепаковки AIMP2+Сборки
Тема для Notepad++(пример парсинга XML)

Достоинства
читать дальше »


◦ Очень маленький размер установочного блока (около 34 Кбайт)
◦ zlib, bzip2 и LZMA-сжатие
◦ Гибкая система скриптов (спецально разработанная для инсталляторов)
◦ Поддержка многоязычности, точнее 53 языка, есть возможность ввода нового языка
◦ Поддержка плагинов
◦ Скрипт Препроцессор
◦ Создание Web-инсталляторов


Ещё немного полезной информации:
читать дальше »

▫ История создания установщика

NSIS создан как альтернатива InstallShield, предназначенного для коммерческих продуктов.

NSIS был создан для распространения Winamp. Он базируется на предыдущем продукте Nullsoft — PiMP (plugin Mini Packager), иначе известным как SuperPiMP. После версии 2.0a0, проект был перемещён на SourceForge.net, где к работе над ним присоединились и сторонние разработчики. NSIS 2.0 был выпущен в свет 2 года спустя.

NSIS версии 1 был очень похож на классический Windows Installer, но он был более управлемым с помощью скриптов и поддерживал другие форматы сжатия. NSIS версии 2 поддерживает новый графический интерфейс пользователя, LZMA-сжатие, многоязычность и имеет хорошую систему плагинов.

Версия 2.01 была первой версией, поддерживающей компиляцию на любой из POSIX-платформ. Это позволило создавать Windows-инсталляторы на GNU/Linux и FreeBSD без использования эмулятора Wine. На данный момент поддерживается компиляция только для Windows.

▫ Описание

Компилятор NSIS — программа makensis — компилирует скрипты в исполняемый код. Каждая строчка скрипта содержит одну команду. Пример:
Код: Выделить весь код
 # Пример скрипта
 Name "Example1"
 OutFile "example1.exe"
 InstallDir "$PROGRAMFILES\Example1"
 Page Directory
 Page InstFiles
 Section
   SetOutPath $INSTDIR
   File ..\makensis.exe
 SectionEnd

Modern User Interface

В версии 2.0 был введён новый графический интерфейс пользователя, названный Modern UI (MUI). MUI очень похож на интерфейс мастеров, он поддерживает splash screen, выбора языка, выбор компонентов для установки и более широкие возможности настройки по сравнению со своим предшественником. Пример:
Код: Выделить весь код
 # Пример скрипта с Modern UI
 !include MUI.nsh
 Name "Example 2"
 OutFile Example2.exe
 !insertmacro MUI_PAGE_WELCOME
 !insertmacro MUI_PAGE_LICENSE "license.rtf"
 !insertmacro MUI_PAGE_DIRECTORY
 !insertmacro MUI_PAGE_COMPONENTS
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_PAGE_FINISH
 !insertmacro MUI_LANGUAGE "English"
 !insertmacro MUI_LANGUAGE "German"
 !insertmacro MUI_LANGUAGE "French"
 Section "Extract makensis"
  SetOutPath $INSTDIR
  File ..\makensis.exe
 SectionEnd
NSIS может быть расширен при помощи плагинов, которые могут быть написаны на C++, Си, и Delphi. Плагины могут быть использованы для улучшения функциональности и интерфейса инсталлятора. Плагины могут быть вызваны в любой части кода NSIS скрипта.

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

▫ Программы, использующие NSIS


◦ Антивирус Касперского
◦ Qip
◦ 3DNA Desktop
◦ 7-Zip
◦ ATI Display Driver
◦ CDex
◦ Dev-C++
◦ DivX
◦ eMule FileZilla
◦ Google Picasa
◦ Google Talk
◦ Intel C (компилятор)
◦ IrfanView
◦ LightAllow
◦ LyX
◦ Miranda IM Mozilla Firefox 2.0
◦ NASA World Wind
◦ Notepad++
◦ OpenOffice.org для Windows
◦ Pidgin
◦ VLC Player
◦ Winamp

▫ Чем я могу распаковать инсталлятор, созданный в NSIS?

В настоящее время инсталляторы NSIS не могут быть полностью декомпилированы. Сам инсталлятор не содержит в себе никаких функций для того, чтобы извлечь сценарий и/или файлы без инсталляции. Это - выбор разработчика, доступны ли исходный текст и/или файлы для инсталлятора для публики или нет. Есть, однако, внешние инструментальные средства, которые позволяют это сделать. 7-zip поддерживает частичную распаковку NSIS инсталляторов с алгоритмом сжатия lzma или bzip. Так же существует мульти-архивный плагин для TotalCommander.
Небольшая заметка для разработчиков: используйте DCryptDll, если хотите скрыть некоторые файлы в вашей инсталляции.


-------
Спасибо ВСЕМ за то, что тратите свое время, что бы ПОМОЧЬ МНЕ.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:02, 09-12-2012

 

Аватара для AlekseyPopovv

Старожил


Сообщения: 169
Благодарности: 6

Профиль | Отправить PM | Цитировать


Как сохранить статус CheckBox на кастомных страницах?
К примеру снимаю галочку с CheckBox и возвращаюсь на предыдущую страницу, потом обратно на следующую и галочка опять стоит.

Отправлено: 15:08, 12-10-2023 | #2811



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


Цитата AlekseyPopovv:
Как сохранить статус CheckBox на кастомных страницах?
К примеру снимаю галочку с CheckBox и возвращаюсь на предыдущую страницу, потом обратно на следующую и галочка опять стоит. »
Завести под каждую галку переменную.
При создании страницы выставить статус галки из переменной.
При выходе со страницы (leave-функция и onBack-колбэк) записать статус галки в переменную.
Скрытый текст
Код: Выделить весь код
ShowInstDetails show
RequestExecutionLevel user
InstallColors /windows
InstallDir $TEMP

Page components
page custom OptionsSaveLoadTest OptionsSaveLoadTest_Leave
Page directory
Page instfiles instfiles_pre

!include LogicLib.nsh
!include nsDialogs.nsh
!include Sections.nsh

Var Option1
Var Option2
Var hOption1
Var hOption2


Section
  DetailPrint 'Exec mandatory section'
SectionEnd

Section /o '-Option 1' SecOpt1
  DetailPrint 'Exec Option1 section'
SectionEnd

Section /o '-Option 2' SecOpt2
  DetailPrint 'Exec Option2 section'
SectionEnd


Function OptionsSaveLoadTest
  nsDialogs::Create 1018
  Pop $0

  GetFunctionAddress $0 OptionsSaveLoadTest_OnBack
  nsDialogs::OnBack $0

  ${NSD_CreateCheckbox} 0 0 100% 8u 'Option&1'
  Pop $hOption1
  ${IfThen} $Option1 == ${BST_CHECKED} ${|} ${NSD_Check} $hOption1 ${|}


  ${NSD_CreateCheckbox} 0 15u 100% 8u 'Option&2'
  Pop $hOption2
  ${IfThen} $Option2 == ${BST_CHECKED} ${|} ${NSD_Check} $hOption2 ${|}

  nsDialogs::Show
FunctionEnd

Function OptionsSaveLoadTest_OnBack
  ${NSD_GetState} $hOption1 $Option1
  ${NSD_GetState} $hOption2 $Option2
FunctionEnd

Function OptionsSaveLoadTest_Leave
  Call OptionsSaveLoadTest_OnBack
FunctionEnd

Function instfiles_pre
  ${IfThen} $Option1 == ${BST_CHECKED} ${|} !insertmacro SelectSection ${SecOpt1} ${|}
  ${IfThen} $Option2 == ${BST_CHECKED} ${|} !insertmacro SelectSection ${SecOpt2} ${|}
FunctionEnd

Function .onInit
  StrCpy $Option1 ${BST_UNCHECKED}
  StrCpy $Option2 ${BST_UNCHECKED}
FunctionEnd
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:57, 13-10-2023 | #2812


Пользователь


Сообщения: 93
Благодарности: 2

Профиль | Отправить PM | Цитировать


Всем хорошего дня.
Если на рабочем столе кликнуть правой кнопкой мыши, то там есть пункт "Обновить". Как эту команду прописать в NSIS?

Отправлено: 14:38, 20-10-2023 | #2813


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


inco1, Можно программно нажать F5
Код: Выделить весь код
System::Call 'user32::GetShellWindow()p.s' ;  hwndShellWindow = GetShellWindow()
System::Call 'user32::SendMessage(ps,i0x111,i0x1A220,i0)' ; SendMessage(hwndShellWindow, WM_COMMAND, MAKELONG(KeyValue,1), NULL)
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:18, 20-10-2023 | #2814

MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


Подскажите пожалуйста, как средствами NSIS переконвертировать(сделать читабельной) последовательность символов (Unicode Escape), к примеру такого вида : \u0412\u0430\u043b\u0435\u043d\u0442\u0438\u043d ?

Отправлено: 12:32, 26-10-2023 | #2815


Аватара для AlekseyPopovv

Старожил


Сообщения: 169
Благодарности: 6

Профиль | Отправить PM | Цитировать


Как победить подобную конструкцию?
Код: Выделить весь код
!macro Test
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\1" "Name"
StrCmp $0 "My" YESREG 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\2" "Name"
StrCmp $0 "My" YESREG 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\3" "Name"
StrCmp $0 "My" YESREG 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\4" "Name"
StrCmp $0 "My" YESREG 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\5" "Name"
StrCmp $0 "My" YESREG 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\6" "Name"
StrCmp $0 "My" YESREG 0
DeleteRegKey HKLM "SOFTWARE\Classes\Prog"
YESREG:
DeleteRegKey /ifempty HKLM "SOFTWARE\Classes\Prog"
!macroend
Error: label "YESREG:" already declared in section

Такая конструкция работает, но это ужас:
Код: Выделить весь код
!macro Test
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\1" "Name"
StrCmp $0 "My" +12 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\2" "Name"
StrCmp $0 "My" +10 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\3" "Name"
StrCmp $0 "My" +8 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\4" "Name"
StrCmp $0 "My" +6 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\5" "Name"
StrCmp $0 "My" +4 0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\6" "Name"
StrCmp $0 "My" +2 0
DeleteRegKey HKLM "SOFTWARE\Classes\Prog"
DeleteRegKey /ifempty HKLM "SOFTWARE\Classes\Prog"
!macroend

Отправлено: 18:50, 26-10-2023 | #2816


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


Цитата MKN:
Подскажите пожалуйста, как средствами NSIS переконвертировать(сделать читабельной) последовательность символов (Unicode Escape), к примеру такого вида : \u0412\u0430\u043b\u0435\u043d\u0442\u0438\u043d ? »
пример
Код: Выделить весь код
ShowInstDetails show
RequestExecutionLevel user
InstallColors /windows
SetFont 'Fira Code Retina' 9
ChangeUI all '${MYNSISDIREXAMPLES}\Contrib\UIs\largelog.exe'

!include LogicLib.nsh
!include Util.nsh

!define SetSystemPluginDestination `!insertmacro SetSystemPluginDestination `
!macro  SetSystemPluginDestination gflag value
  !define ${gflag} ${value}
  !if      ${value}  == 's'
  !else if ${value} S== 'r0'
  !else if ${value} S== 'r1'
  !else if ${value} S== 'r2'
  !else if ${value} S== 'r3'
  !else if ${value} S== 'r4'
  !else if ${value} S== 'r5'
  !else if ${value} S== 'r6'
  !else if ${value} S== 'r7'
  !else if ${value} S== 'r8'
  !else if ${value} S== 'r9'
  !else if ${value} S== 'R0'
  !else if ${value} S== 'R1'
  !else if ${value} S== 'R2'
  !else if ${value} S== 'R3'
  !else if ${value} S== 'R4'
  !else if ${value} S== 'R5'
  !else if ${value} S== 'R6'
  !else if ${value} S== 'R7'
  !else if ${value} S== 'R8'
  !else if ${value} S== 'R9'
  !else
  !define /redef ${gflag} 's'
  !endif
!macroend

!define ChrW `!insertmacro ChrW `
!macro  ChrW result int
  !ifndef CharConvertBuffer16Initialized
    !define CharConvertBuffer16Initialized
    Var /GLOBAL g_CharConvertBuffer16
    System::Call '*(&i2)p.s'
    Pop $g_CharConvertBuffer16
  !endif
  ${SetSystemPluginDestination} ${__MACRO__}SymbolDestination ${result}
  System::Call '*$g_CharConvertBuffer16(&i2 ${int})'
  System::Call '*$g_CharConvertBuffer16(&w1 .${${__MACRO__}SymbolDestination})'
  !if ${${__MACRO__}SymbolDestination} == 's'
  Pop ${result}
  !endif
  !undef ${__MACRO__}SymbolDestination
!macroend

!define StrUnicodeUnescape `!insertmacro StrUnicodeUnescape `
!macro StrUnicodeUnescape result str
  !if '${str}' != 's'
  Push '${str}'
  !endif
  ${CallArtificialFunction} StrUnicodeUnescape_
  !if ${result} != 's'
  Pop ${result}
  !endif
!macroend

!macro StrUnicodeUnescape_
  Exch $0 ; [in] EscapedUnicodeString / [out] UnescapedUnicodeString
  Push $1 ; / EscapedUnicodeString
  Push $2 ; Counter
  Push $3 ; GetChar
  Push $4 ; GetChar2

  StrCpy $1 $0
  StrCpy $0 ''
  StrCpy $2 -1

  ${Do}
    IntOp $2 $2 + 1
    StrCpy $3 $1 1 $2
    ${IfThen} $3 == '' ${|} ${ExitDo} ${|}
    ${If} $3 == '\'
      IntOp $4 $2 + 1
      StrCpy $4 $1 1 $4
      ${If} $4 == 'u'
        IntOp $2 $2 + 2
        StrCpy $3 $1 4 $2
        IntOp $2 $2 + 3
        ${ChrW} r3 0x$3
      ${EndIf}
    ${EndIf}
    StrCpy $0 $0$3
  ${Loop}
 
  Pop $4
  Pop $3
  Pop $2
  Pop $1
  Exch $0
!macroend

Section
  StrCpy $1 '\u0412\u0430\u043b\u0435нт\u0438\u043d'
  DetailPrint '>> [$1]'

  ${StrUnicodeUnescape} $0 $1
  DetailPrint "<< [$0]"

  Push $1
  ${StrUnicodeUnescape} $0 s
  DetailPrint "<< [$0]"

  Push $1
  ${StrUnicodeUnescape} s s
  Pop $0
  DetailPrint "<< [$0]"
SectionEnd
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:24, 26-10-2023 | #2817


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


Цитата AlekseyPopovv:
Error: label "YESREG:" already declared in section »
Препроцессор раскрывает !insertmacro в содержимое макроса. Поэтому, если макрос используется более одного раза в секции/функции, происходит дублирование меток и ошибка.

Возможные решения:

1. Применять функции.
Параметры передавать нужно через стек. А также делать раздельные функции для install/uninstall или писать дополнительную логику для объявления функции в install и/или uninstall.

2. Применять вызов через ${CallArtificialFunction} (Util.nsh)
Параметры передавать нужно через стек. Реализация через установку метки и Goto на неё делает невозможным воздействие на код макроса флагами извне отдельно на каждый вызов, но это скорее понадобится для создания библиотечных макросов со сложной логикой.

3. Добавить в качестве префикса к метке уникальное в пределах текущего вызова макроса значение.
LogicLib.nsh использует такой метод (но в отличной от примера реализации).
пример
Код: Выделить весь код
!macro DigitIsOdd return value
  ; объявить префикс
  !define LABEL__ ${__MACRO__}.__LABEL__.${__COUNTER__}

  StrCmp '${value}' 1 ${LABEL__}YES 0
  StrCmp '${value}' 3 ${LABEL__}YES 0
  StrCmp '${value}' 5 ${LABEL__}YES 0
  StrCmp '${value}' 7 ${LABEL__}YES 0
  StrCmp '${value}' 9 ${LABEL__}YES 0
  Goto ${LABEL__}NO

  ${LABEL__}YES:
  StrCpy ${return} 'yes'
  Goto ${LABEL__}EXIT
  
  ${LABEL__}NO:
  StrCpy ${return} 'no'
  
  ${LABEL__}EXIT:
  
  ; удалить префикс
  !undef LABEL__
!macroend


4. Изменить структуру кода, использовать LogicLib, если это возможно и не ухудшает читаемость кода.
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:55, 26-10-2023 | #2818

MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


iglezz, - замечательно ! (и где такому "волшебству" учат ? )
Некоторые детали кода не оч. понятны... largelog.exe в моих дистр-ах NSIS отсутствует(нужен для лога-проверки ?)
Почему на выходе три варианта ${StrUnicodeUnescape} - "[$0]" ?
Будет ли декодироваться не кириллическая таблица символов ?
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:23, 27-10-2023 | #2819


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


MKN, Вся видимая сложность тут для ускорения и некоторых дополнительных плюшек. А так, тут нет никакой магии, только примитивный парсинг строки и знание, что с помощью плагина System можно преобразовывать код символа в символ и обратно.
Цикл в StrUnicodeUnescape_ очень простой, умеет обнаруживаь и преобразовывать последовательность \u#### в юникод-символ. Без каких либо дополнительных проверок на корректность читаемых данных. По хорошему, надо, как минимум, добавить проверку на то, что после '\u' есть ровно четыре символа, которые являются валидным hex-числом.

largelog.exe - это мой специальный тестовый UI большего размера (230% оригинала) для дебага через DetailPrint.
Три варианта демонстрируют возможность читать строку со стека и записывать результат в стек. Это может быть полезно в сочетании в вызовами WinAPI функций через System::Call.
Декодируются все коды формата \u####
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:21, 27-10-2023 | #2820



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 2 dimadr Наборы обновлений для Windows XP/2003/Windows 7 267 14-02-2020 08:25
[архив].: NSIS - все вопросы :. kotkovets Автоматическая установка приложений 3387 09-12-2012 11:56
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 1 jameszero Наборы обновлений для Windows XP/2003/Windows 7 1491 22-07-2011 22:42
Выбор|модернизация процессора .:[все вопросы]:. Часть I Myxa Выбор отдельных компонентов компьютера и конфигурации в целом 1845 01-01-2011 19:18
Вопросы по создателю инсталляций NSIS MaxDELETE Программное обеспечение Windows 14 04-07-2007 10:01




 
Переход