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

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


Цитата Salmo:
видимое оно, в данный момент, или нет? »
Код: Выделить весь код
StrCpy $0 "hwnd"
System::Call "user32::IsWindowVisible(i r0)i.r0"
# $0 here is non-zero if the window is visible.
Цитата Salmo:
найти дочерние окна по типу\названию и определить HWND »
попробуй через EnumChildWindow (в доке есть код )
или EnhancedFindWindow

Вот код, перечислит все видимые окна :
Код: Выделить весь код
!include LogicLib.nsh
showinstdetails show
outfile wind.exe
Section
System::Get "(i.r1) iss"
Pop $R0
System::Call "user32::EnumWindows(k R0,i) i.s"
loop:
    Pop $0
    StrCmp $0 "callback1" 0 done
    System::Call "user32::IsWindowVisible(ir1)i.r2"
    ${If} $2 <> 0
        System::Call "user32::GetWindowText(ir1,t.r2,i${NSIS_MAX_STRLEN})"
        System::Call "user32::GetClassName(ir1,t.r3,i${NSIS_MAX_STRLEN})"
        IntFmt $1 "0x%X" $1
        DetailPrint "$1 - [$3] $2"
    ${EndIf}
    Push 1 # callback's return value
    System::Call "$R0"
    Goto loop
done:
System::Free $R0
Sectionend

Последний раз редактировалось MKN, 02-11-2013 в 14:48.

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

Отправлено: 14:42, 02-11-2013 | #691



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

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


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


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

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


MKN, Спасибо! Обошелся поиском всех видимых окон и последующей фильтрацией... Как всегда, что-нибудь упустишь! Нужно еще определить размер окна и его расположение на мониторе...

Отправлено: 22:42, 02-11-2013 | #692

MKN MKN вне форума

Ветеран


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

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


Цитата Salmo:
Нужно еще определить размер окна и его расположение на мониторе... »
И это уже было в доках...
Код: Выделить весь код
;Функция GetWindowRect извлекает размеры рабочего прямоугольника определяемого окна. 
;Размеры даются в экранной системе координат, которые считаются относительно 
; левого верхнего угла экрана

; Create RECT struct
	System::Call "*${stRECT} .r1"
; Find Window info for the window we're displaying
	System::Call "User32::GetWindowRect(i, i) i ($HWNDPARENT, r1) .r2"
Если ещё конкретней, то как то так :

Код: Выделить весь код
OutFile Rect_test.exe

Section
Push $R0
System::Call /NOUNLOAD "*(i, i, i, i) i.s"
Pop $R0
System::Call /NOUNLOAD 'User32::GetWindowRect(i, i) i ($HWNDPARENT, R0)'
System::Call /NOUNLOAD "*$R0(i .s, i .s, i .s, i .s)"
Pop $0 ;left
Pop $1 ;top
Pop $2 ;right
Pop $3 ;bottom
Messagebox mb_ok "$$0:$0 $$1:$1 $$2:$2 $$3:$3"
SectionEnd
А ещё есть функция GetWindowInfo с хорошими примерами : http://nsis.sourceforge.net/GetWindowInfo

Последний раз редактировалось MKN, 03-11-2013 в 10:24.

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

Отправлено: 09:53, 03-11-2013 | #693


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


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

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


MKN, Вы меня, прямо, балуете, спасибо... Я не лентяй, просто у меня еще нет навыка в поиске информации. Буду изучать и, если что, рассчитываю еще на Ваш опыт...

А можно заставить окно инсталлятора открываться не в центре экрана, а по координатам, которые я укажу в той же системе, что и в вашем примере выше?

Последний раз редактировалось Salmo, 03-11-2013 в 14:19.


Отправлено: 14:11, 03-11-2013 | #694

MKN MKN вне форума

Ветеран


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

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


Цитата Salmo:
А можно заставить окно инсталлятора открываться не в центре экрана, а по координатам, которые я укажу »
И про это уже было...
Код: Выделить весь код
!include "MUI2.nsh"
!define MUI_CUSTOMFUNCTION_GUIINIT Welcome
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

OutFile RepositionWindow_test.exe

!define stRECT "(i, i, i, i) i"
!define SPI_GETWORKAREA             0x0030

Function Welcome 

; Создать RECT структуру.  Внутри этой структуры координаты углов. 
; Верхний левый угол определяется двумя координатами left и top. 
; Нижний правый соответственно определяется двумя оставшимися координатами - right и bottom.

System::Call "*${stRECT} .r1"
         
; Получить окно прямоугольника.Функция GetWindowRect отыскивает размеры рамки ограничивающей прямоугольник 
;определяемого окна. Размеры даны в экранных координатах, которые расположены относительно левого верхнего угла экрана.

System::Call "User32::GetWindowRect(i, i) i ($HWNDPARENT, r1) .r2"
         
; Получить координаты
System::Call "*$1${stRECT} (.r2, .r3, .r4, .r5)"

; Рассчитать ширину / высоту нашего окна
IntOp $2 $4 - $2 ; $2 - ширина
IntOp $3 $5 - $3 ; $3 - высота
         
; Определить размер рабочего стола без панели задач
System::Call "User32::SystemParametersInfo(i, i, i, i) i (${SPI_GETWORKAREA}, 0, r1, 0) .r4" 
         
; Получить координаты
System::Call "*$1${stRECT} (.r4, .r5, .r6, .r7)"
         
System::Free $1

; правую сторону экрана разделить на 4
         IntOp $0 $6 / 4
         IntOp $8 $2 / 4
         IntOp $0 $0 - $8
 ; нижнюю часть экрана разделить на 4
         IntOp $1 $7 / 4
         IntOp $8 $3 / 4
         IntOp $1 $1 - $8

;Установить новую позицию окна
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($HWNDPARENT, 0, $0, $1, 0, 0, 0x201)"
FunctionEnd

Section
SectionEnd
Цитата Salmo:
Я не лентяй »
Хмм... Шутка ?
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:14, 03-11-2013 | #695


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


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

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


Цитата MKN:
Хмм... Шутка ? »
Спасибо... В каждой шутке есть.... Признаю, что выглядит, именно, так.

Отправлено: 18:25, 03-11-2013 | #696


Старожил


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

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


kotkovets, подскажите пожалуйста как такой батник выполнить командами nsis:
Код: Выделить весь код
@Echo Off
color 1e
Title “Обновление Microsoft Office 2013
::“Обновление Microsoft Office 2013
set "path=%SystemRoot%;%SystemRoot%\system32;%SystemRoot%\system32\wbem"
reg export HKLM\Software\Policies\Microsoft\Windows\Installer "%temp%\installer.reg"
reg add HKLM\Software\Policies\Microsoft\Windows\Installer /v MaxPatchCacheSize /t REG_DWORD /d 0 /f
net stop msiserver
cls
for /f %%i in ('dir /b /O-s Updates\*.msp') do (Call :SetupUpd %%i)
:SetupUpd
echo “Обновление	%1
Updates\%1 /qn /norestart
GoTo :EOF

Отправлено: 22:09, 04-11-2013 | #697


Аватара для kotkovets

Ветеран


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

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


Цитата diakov:
подскажите пожалуйста как такой батник выполнить командами nsis: »
читать дальше »
Код: Выделить весь код
!include "MUI2.nsh"
!include "FileFunc.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English

ShowInstDetails show
outfile nets.exe

Section
     SetDetailsPrint textonly
     DetailPrint "Обновление Microsoft Office 2013"
     SetDetailsPrint none
     IfFileExists "$TEMP\installer.reg" 0 +2
     Delete "$TEMP\installer.reg"
     SetDetailsPrint listonly
     nsExec::Exec 'reg export HKLM\Software\Policies\Microsoft\Windows\Installer "$TEMP\installer.reg"'
     Pop $0
     nsExec::Exec 'reg add HKLM\Software\Policies\Microsoft\Windows\Installer /v MaxPatchCacheSize /t REG_DWORD /d 0 /f'
     Pop $0
     nsExec::Exec 'net stop msiserver'
     Pop $0
     StrCmp $0 2 0 +3
     MessageBox MB_OK "$0 Служба не запущена или хз" IDOK
     Abort
     SetDetailsPrint none
     ${Locate} "Путь к папке\Updates" "/L=F /M=*.msp /G=0" Updates
     
    SetDetailsPrint both
SectionEnd

Function Updates
  SetDetailsPrint textonly
  DetailPrint "Обновление Microsoft Office 2013"
  SetDetailsPrint listonly
  DetailPrint "Обновление $R7"
  
    ExecWait 'msiexec /i "$R9" /norestart /qn' $R1
    
    ;dumpstate::debug
  Push $0
FunctionEnd

Насчет команды запуска *.msp файлов на примере msi
Код: Выделить весь код
ExecWait 'msiexec /i "$R9" /norestart /qn' $R1
В $R9 - путь к файлу\*.msp
В общем допиливайте опытным путем до рабочего состояния - примерно так...
---
p.s
и в конце предложите перезагрузиться..

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


Последний раз редактировалось kotkovets, 05-11-2013 в 01:09.

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

Отправлено: 00:59, 05-11-2013 | #698


Аватара для Limonica

Старожил


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

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


kotkovets, пересматриваю ваш код по установке устройств, но есть странная особенность установка\обновление идет только в том случае если устройство уже установленно, если же оно не установленно ничего не происходит. Тестировался нижеследущий код XP Professional - все ок, XP Home - установка не проходит, в чем может быть проблема, непонятно, буду благодарен если посмотрите...

Код: Выделить весь код
!define ERROR_NO_SUCH_DEVINST       -536870389
!define SPOST_NONE                  0
!define SPOST_PATH                  1
!define SPOST_URL                   2
!define SP_COPY_DELETESOURCE        0x1
!define SP_COPY_REPLACEONLY         0x2
!define SP_COPY_NOOVERWRITE         0x8
!define SP_COPY_OEMINF_CATALOG_ONLY 0x40000
!define CM_LOCATE_DEVNODE_NORMAL    0x00000000
!define CM_REENUMERATE_NORMAL       0
!define InstallDriver               "!insertmacro InstallDriverCall"
 
!include "logiclib.nsh"
 
 
!macro InstallDriverCall HID INFPATH INFDIR
 
     System::Store S 
      Push "${INFDIR}"
      Push "${INFPATH}"
      Push "${HID}"
 
      DetailPrint "Rescan drivers..."
 
      System::Call "cfgmgr32::CM_Locate_DevNode(*i.r0, n, i${CM_LOCATE_DEVNODE_NORMAL}) i.r1"
 
      ${If} $1 <> 0
 
         StrCpy $1 1
 
      ${Else}
 
          System::Call "cfgmgr32::CM_Reenumerate_DevNode (ir0, i${CM_REENUMERATE_NORMAL}) i.r1"
 
         ${IfThen} $1 <> 0 ${|}StrCpy $1 2${|}
 
      ${EndIf}
 
      ${If} $1 = 0
 
          DetailPrint "Installing the driver..."
 
          System::Call "newdev::UpdateDriverForPlugAndPlayDevices(i0, ts, tss, i0, *i0)?ei.s"
 
         Pop $0
 
         IntCmp $0 ${ERROR_NO_SUCH_DEVINST} 0 +2 +2
 
         DetailPrint "The device is not plugged in, cannot update the driver."
 
         ${If} $0 = 0
 
              System::Call "setupapi::SetupCopyOEMInf(ts, ts, i${SPOST_PATH}, i0, i0, i0, *i0, tn)i.r0"
 
              IntCmp $0 1 0 +2 +2
 
              DetailPrint "Istall driver success!"
 
              IntCmp $0 0 0 +2 +2
 
              DetailPrint "Istall driver error!"
 
         ${EndIf}
 
    ${ElseIf} $1 = 1
 
          DetailPrint "An error occurred while trying to get the device instance for the machine"
 
    ${ElseIf} $1 = 2
 
          DetailPrint "An error occurred while trying to refresh the device list"
 
    ${EndIf}
 
    System::Store L
 
!macroend
 
 
 
OutFile InstDrv.exe
 
ShowInstDetails show
 
 
 
Section
 
   # ${InstallDriver} "HWID" "путь к inf файлу" "папка с дровами"
 
   ${InstallDriver} "ROOT\RDPDR" "$WINDIR\inf\machine.inf" "$WINDIR\inf"
 
SectionEnd

Последний раз редактировалось Limonica, 05-11-2013 в 01:44.


Отправлено: 01:33, 05-11-2013 | #699


Старожил


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

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


kotkovets, спаибо большое, и еще один вопрос, в справке сказано о команде nsExec::Exec для скрытного запуска консольных утилит, cmd и bat файлов, так вот можно запустить cmd файл, но только в видимом режиме и с невозможностью закрытия окна консоли, то есть что бы окно закрывалось уже когда батник завершит все свои дела. Можно воспользоваться ExecShell "open", но тогда как решить проблему невозможности закрытия окна cmd до завершения процесса?

Отправлено: 09:38, 05-11-2013 | #700



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




 
Переход