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

Компьютерный форум 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

 
MKN MKN вне форума

Ветеран


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

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


Цитата wolkow70:
Как лучше определить, что юзаем десятку? »
WinVer2.nsh от kotkovets правильно определяет ОС - Win10 + прочие параметры десятки, но... в пределах запуска скомпилированного скрипта с HDD...
Запускаю тот же скомпилированный скрипт с флешки - ОС Win10, почему то определяется как Win8 + прочие параметры восьмёрки...
И как это понимать ? Сначала было даже смешно..., но как работать с флешки ?

Отправлено: 15:30, 22-10-2015 | #1861



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

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


Аватара для wolkow70

Ветеран


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

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


MKN,
Windows 8.1 - 6.3
Windows 8 - 6.2
Windows 10 - 10.0
https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx
У меня в реестре почему-то
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"ProductName"="Windows 10 Home"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"CurrentVersion"="6.3"

Цитата MKN:
WinVer2.nsh от kotkovets »
Этот хедер не совместим одновременно со стандартным WinVer.nsh, который мне нужен в скрипте. Вот если бы отдельно функцию выдрать...

-------
Человек человеку - друг, товарищ и волк!


Отправлено: 15:45, 22-10-2015 | #1862

MKN MKN вне форума

Ветеран


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

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


Т.е. - при запуске exe-скрипта с флешки из под Win10 и с помощью чисто GetVersionEx, и с помощью WinVer2.nsh - ошибочная версия ОС. (при запуске с флешки из под W7 и W8 - всё ОК)
При запуске с флешки из под Win10 с помощью WMI.nsh ( т.е. с использованием WMIC) - всё определяется правильно :

Код: Выделить весь код
;http://nsis.sourceforge.net/WMI_header
OutFile "OperatingSystemInfo.exe"
!include MUI2.nsh
!include WMI.nsh
!include LogicLib.nsh
!insertmacro MUI_LANGUAGE "English"

Var WMI_Caption
Var WMI_Version
Var WMI_CSDVersion
Var WMI_ServicePackMajorVersion
Var WMI_ServicePackMinorVersion
Var WMI_PushVar

Section 
; короткое описание версии операционной системы
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Caption callback_Function
 StrCpy $WMI_Caption $WMI_PushVar

 ; версия ОС
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Version callback_Function
 StrCpy $WMI_Version $WMI_PushVar

; последний установленный сервис-пак (строка); если никакой сервис-пак не установлен, пустая строка.
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem CSDVersion callback_Function
 StrCpy $WMI_CSDVersion $WMI_PushVar

; версия сервис-пака
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem ServicePackMajorVersion callback_Function
 StrCpy $WMI_ServicePackMajorVersion $WMI_PushVar

; подверсия сервис-пака
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem ServicePackMinorVersion callback_Function
 StrCpy $WMI_ServicePackMinorVersion $WMI_PushVar
SectionEnd
 
Function callback_Function
System::Call "user32::OemToChar(t R2, t. r2)"
detailprint "$2"
StrCpy $WMI_PushVar $2 
FunctionEnd
А такой код (ранее предложенный kotkovets), в Win10 - c HDD работате нормально, с флешки в Win10 - вообще не работает
Код: Выделить весь код
OutFile "WMI_OperatingSystem.exe" 
!include "LogicLib.nsh" 

!macro IWbemClassObject->Get NameObject OUT
    System::Call "*(i,i,i)i.R4"
    System::Call "$R3->4(w'${NameObject}',i0,iR4,i0,i0)"
    System::Call "*$R4(i.R6,i,i.R5)"
    StrCmp $R6 3 0 +2
    IntFmt $R5 %u $R5
    StrCmp $R6 8 0 +2
    !ifdef NSIS_UNICODE
      IntFmt $R5 %s $R5
    !else
      IntFmt $R5 %S $R5
    !endif
    System::Call "ole32::VariantClear(iR4)"
    System::Free $R4
    StrCpy ${OUT} $R5
!macroend

Section
   System::Call "ole32::CoInitializeEx(i0,i2)"
   System::Call "ole32::CoCreateInstance(g'{4590f811-1d3a-11d0-891f-00aa004b2e24}',i0,i1,g'{dc12a687-737f-11cf-884d-00aa004b2e24}',*i.R0)i.R7"
   ${If} $R7 == 0
      System::Call "ole32::CoInitializeSecurity(i0,i-1,i0,i0,i2,i3,i0,i0,i0)"
      System::Call "$R0->3(w'root\CIMV2',i0,i0,i0,i0,i0,i0,*i.R1)i.R7"
      ${If} $R7 == 0
         System::Call "$R1->20(w'WQL', w'SELECT * FROM Win32_OperatingSystem',i48,i0,*i.R2)i.R7"
         System::Call "$R2->4(i0xffffffff,i1,*i.R3,*i)i.R7"
         ${If} $R7 == 0
              
			    !insertmacro IWbemClassObject->Get "Caption" $7
                      MessageBox MB_OK "Caption=$7"
				!insertmacro IWbemClassObject->Get "Version" $7
				     MessageBox MB_OK "Version=$7"
							 
               System::Call "$R0->2()"
               System::Call "$R1->2()"
               System::Call "$R2->2()"
               System::Call "$R3->2()"
         ${Else}
            System::Call "$R0->2()"
            System::Call "$R1->2()"
            System::Call "$R2->2()"
         ${EndIf}
      ${Else}
        System::Call "$R0->2()"
        System::Call "$R1->2()"
      ${EndIf}
  ${EndIf}
SectionEnd
Может Вячеслав скажет в чём тут дело ? (и подправит код...)

PS StdUtils плаг - также правильно определяет параметры Win10, и с флешки и с HDD. (кстати, он обновился Version 1.08, released 2015-10-10 )

Последний раз редактировалось MKN, 22-10-2015 в 16:34.


Отправлено: 15:56, 22-10-2015 | #1863


Аватара для wolkow70

Ветеран


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

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


MKN,
Коды WMI работают, но нужно в какой-то переменной просто получить значение 10, а не полную версию Оси.
Можно конечно отрезать, но это уже гемор дополнительный.

-------
Человек человеку - друг, товарищ и волк!


Последний раз редактировалось wolkow70, 22-10-2015 в 17:44.


Отправлено: 17:39, 22-10-2015 | #1864


Аватара для kotkovets

Ветеран


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

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


Цитата MKN:
с флешки в Win10 - вообще не работает »
спотыкается здесь именно выделенным, возвращается не ноль в $R7, загадка, причины непонятна......
Код: Выделить весь код
         System::Call "$R1->20(w'WQL', w'SELECT * FROM Win32_OperatingSystem',i48,i0,*i.R2)i.R7"
         System::Call "$R2->4(i0xffffffff,i1,*i.R3,*i)i.R7"
         ${If} $R7 == 0

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


Отправлено: 20:15, 22-10-2015 | #1865

MKN MKN вне форума

Ветеран


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

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


Пример "географического" кода для определения параметров локализации
(используются функции GetUserDefaultLangID GetLocaleInfo GetUserGeoID GetGeoInfo ) :

PHP код: Выделить весь код

OutFile "GetGeoInfo_test.exe"

!include LogicLib.nsh
LCTYPE Constants   -  https://msdn.microsoft.com/en-us/library/ms906223.aspx
!define LOCALE_SCOUNTRY 6
!define LOCALE_SENGCOUNTRY 4098
!define LOCALE_SENGLANGUAGE 0x00001001
;  SYSGEOTYPE enumeration  -  https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd374071(v=vs.85).aspx
!define GEOCLASS_NATION 16
!define GEOID_NOT_AVAILABLE -1
!define GEO_ISO2 4
!define GEO_ISO3 5
!define GEO_OFFICIALNAME 9
!define GEO_LATITUDE 2
!define GEO_LONGITUDE 3

Section
System
::Call 'KERNEL32::GetUserDefaultLangID()i.r0'
    
DetailPrint LANGID=$0  ;  ID языкапо умолчанию используемого в локали текущего пользователя
System
::Call 'KERNEL32::GetLocaleInfo(i$0,i${LOCALE_SENGCOUNTRY},t.r1,i1000)'
    
DetailPrint LOCALE_SENGCOUNTRY=$1  Полное английское название страны региона
System::Call 'KERNEL32::GetLocaleInfo(i$0,i${LOCALE_SCOUNTRY},t.r1,i1000)'
    
DetailPrint LOCALE_SCOUNTRY=$1  Полное локализованное название страны региона.
System::Call 'KERNEL32::GetLocaleInfo(i$0,i${LOCALE_SENGLANGUAGE},t.r1,i1000)'
    
DetailPrint LOCALE_SENGLANGUAGE=$;  Полное английское название языка по международному стандарту кода языков ISO 639 )

текущий регион (местоположение)
Table of Geographical Locations  -  https://msdn.microsoft.com/en-us/library/dd374073.aspx
System::Call 'KERNEL32::GetUserGeoID(i${GEOCLASS_NATION})i.r0'
    
DetailPrint GEOID=$Geographical location identifier (Decimal). 203 Russia
${If} $<> ${GEOID_NOT_AVAILABLE} ; Only available if the user has set a country/location
${AndIf} $!= "error" GetUserGeoID is WinXP+

Извлекаем информацию о заданном географическом местоположении на основании GeoID
System
::Call 'KERNEL32::GetGeoInfo(i$0,i${GEO_ISO2},t.r1,i1000,i0)'
    
DetailPrint GEO_ISO2=$1  ;  2-буквенный код страны региона
System
::Call 'KERNEL32::GetGeoInfo(i$0,i${GEO_ISO3},t.r1,i1000,i0)'
    
DetailPrint GEO_ISO3=$1  ;  3-буквенный код страны региона
System
::Call 'KERNEL32::GetGeoInfo(i$0,i${GEO_OFFICIALNAME},t.r1,i1000,i0)'
    
DetailPrint GEO_OFFICIALNAME=$1  ;  Официальное название страны
System
::Call 'KERNEL32::GetGeoInfo(i$0,i${GEO_LATITUDE},t.r1,i1000,i0)'
координаты расположения страны (точка на карте в центре страны)
    
DetailPrint GEO_LATITUDE=$1  Широта местаЭто значение число с плавающей точкой.
System::Call 'KERNEL32::GetGeoInfo(i$0,i${GEO_LONGITUDE},t.r1,i1000,i0)'
    
DetailPrint GEO_LONGITUDE=$1  Долгота местаЭто значение числo с плавающей точкой.
${EndIf}
SectionEnd 

В частности, практический интерес представляет функция GetUserGeoID. Можно автоматом (не выбирая язык из списка) устанавливать, к примеру, язык интерфейса установки и т.д., соответствующий локали пользователя, запустившего инсталлятор.

Последний раз редактировалось MKN, 24-10-2015 в 12:37.


Отправлено: 12:27, 24-10-2015 | #1866

MKN MKN вне форума

Ветеран


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

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


Да... Похоже для определения Windows 10 надо использовать новую функцию - IsWindowsVersionOrGreater
http://stackoverflow.com/questions/3...ect-windows-10
http://www.tek-tips.com/faqs.cfm?fid=7848

Осталось адаптировать эту функцию под NSIS...

Отправлено: 11:12, 25-10-2015 | #1867

MKN MKN вне форума

Ветеран


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

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


Вариант определения major и minor версий ОС с помощью функции NetWkstaGetInfo.
В Win 10 работатет (и с флешки тоже)

Код: Выделить весь код
OutFile WinVer-NetWkstaGetInfo.exe
InstallDir $TEMP
ShowInstDetails show
RequestExecutionLevel admin
Page instfiles
# Примечание: В старых версиях NSIS (в том числе 2,46) System plug-in не поддерживае тип р, нужный для правильной работы кода

; используется структура WKSTA_INFO_100 https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa371402(v=vs.85).aspx
; а именно : DWORD wki100_ver_major  и   DWORD wki100_ver_minor;

Section
    System::Call "netapi32::NetWkstaGetInfo(pn,i100,*p.R1)i.R2"  
    System::Call "*$R1(i,p,p,i.R3,i.R4)"
# в $R3 - основной номер версии ОС ver_major, в $R4 - доп. номер версии**ver_minor
    IntOp $R0 $R3 << 16
    IntOp $R0 $R0 | $R4
    System::Call "netapi32::NetApiBufferFree(pR1)"
;Результат в шестнадцатеричной системе счисления
    # 0x00050000  5.0  Windows 2000
    # 0x00050001  5.1  Windows XP
    # 0x00050002  5.2  Windows XP (x64),  Windows Server 2003, Windows Server 2003 R2
    # 0x00060000  6.0  Windows Vista,         Windows Server 2008
    # 0x00060001  6.1  Windows 7,                Windows Server 2008 R2
    # 0x00060002  6.2  Windows 8,                Windows Server 2012
    # 0x00060003  6.3  Windows 8.1,             Windows Server 2012 R2
    # 0x000A0000  10.0 Windows 10,            Windows Server Technical Preview
    IntFmt $R0 "0x%08X" $R0
DetailPrint "$R0"
; получаем ver_major и ver_minor "в десятичном виде"
    IntOp $0 $R0 >> 16
    IntOp $1 $R0 & 0xFFFF
DetailPrint "$0.$1"
SectionEnd
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:01, 27-10-2015 | #1868


Аватара для wolkow70

Ветеран


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

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


MKN,
Я для своих нужд так сделал:

Var IsOSWin10
StrCpy $IsOSWin10 "0"

Push $R0
Push $R1
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "ProductName"
StrCpy $R1 $R0 10
${If} $R1 == "Windows 10"
StrCpy $IsOSWin10 "1"
${EndIf}
Pop $R1
Pop $R0

${If} $IsOSWin10 == "1"
Выполняем комманды для Windows 10
${EndIf}

-------
Человек человеку - друг, товарищ и волк!


Последний раз редактировалось wolkow70, 27-10-2015 в 18:53.


Отправлено: 14:57, 27-10-2015 | #1869


Аватара для kotkovets

Ветеран


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

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


Цитата MKN:
Вариант определения major и minor версий ОС с помощью функции NetWkstaGetInfo »
будет время попытаюсь, вшить эти директивчики десяточные в winver2
Цитата MKN:
# Примечание: В старых версиях NSIS (в том числе 2,46) System plug-in не поддерживае тип р, нужный для правильной работы кода »
нормально всё работает на 2,46, вместо p - i (integer)

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


Последний раз редактировалось kotkovets, 29-10-2015 в 08:10. Причина: i вместо p


Отправлено: 21:40, 27-10-2015 | #1870



Компьютерный форум 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




 
Переход