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

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

 

Аватара для ZVSRus

Старожил


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

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


Цитата skinny21:
В данном случае, берётся образ и закидывается на сам лаунчер UltraISOPortable.exe
Снова не понятно, что за образ, и как это закидывается на сам лаунчер.
Может вам нужен лаунчер к портативке собранной в один файл в турбо или тинапе или к портативке от автора программы?

-------
Inno Setup 5.5.1.ee2 Ultra ANSI Unicode


Последний раз редактировалось ZVSRus, 28-01-2018 в 22:08.


Отправлено: 22:02, 28-01-2018 | #2171



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

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


Новый участник


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

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


Цитата ZVSRus:
что за образ »
Образ Христа Спасителя

Отправлено: 22:13, 28-01-2018 | #2172


Аватара для Flix

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


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

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


Цитата skinny21:
Подскажите как сделать так чтобы работало открытие файла, путём перетаскивания файла на лаунчер. »
При работе функции Drag-N-Drop средствами виндовс исполняемому файлу в качестве аргумента командной строки передается полный путь к перетаскиваемому файлу. Таким образом, средствами NSIS вам необходимо получить полный путь к перетаскиваемому файлу и передать его файлу программы в качестве аргумента. Параметры командной строки определяются путем чтения значения из переменной $CMDLINE. Есть уже готовая функция, которая выполняет эту операцию: Get command line parameters

Вам останется только прикрутить её к вашему сценарию.

Вот простейший пример её использовании (на базе UltraISOPortable по вашей ссылке)
Скрытый текст
Код: Выделить весь код
Name "UltraISOPortable"
OutFile "UltraISOPortableTest.exe"
InstallDir $EXEDIR\Temp
RequestExecutionLevel user
SilentInstall silent

Page instfiles

Section ""

  SetOutPath $EXEDIR\App\UltraISO

  StrCmp $CMDLINE "" 0 param
    StrCpy $0 ""
    Goto runexe

  param:
    Call GetParameters
    Pop $0

  runexe:
    Exec '"$EXEDIR\App\UltraISO\UltraISO.exe" $0'

SectionEnd

Function GetParameters
 
  Push $R0
  Push $R1
  Push $R2
  Push $R3
 
  StrCpy $R2 1
  StrLen $R3 $CMDLINE
 
  StrCpy $R0 $CMDLINE $R2
  StrCmp $R0 '"' 0 +3
    StrCpy $R1 '"'
    Goto loop
  StrCpy $R1 " "
 
  loop:
    IntOp $R2 $R2 + 1
    StrCpy $R0 $CMDLINE 1 $R2
    StrCmp $R0 $R1 get
    StrCmp $R2 $R3 get
    Goto loop
 
  get:
    IntOp $R2 $R2 + 1
    StrCpy $R0 $CMDLINE 1 $R2
    StrCmp $R0 " " get
    StrCpy $R0 $CMDLINE "" $R2
 
  Pop $R3
  Pop $R2
  Pop $R1
  Exch $R0
 
FunctionEnd

Что делает этот лаунчер? При запуске проверяет наличие аргументов командной строки (в данном случае путь к файлу образа). Если они есть, что считывает их в переменную $0 и передает её в команду запуска программы. Если их нет, то переменной $0 присваивается пустое значение и запуск программы выполняется без параметров.

Чтобы проверить его работу, поместите файл лаунчера UltraISOPortableTest.exe рядом (в одной папке) с оригинальным файлом загрузчика UltraISOPortable.exe. Затем можно просто запустить его или перетянуть на него файл образа.

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

Отправлено: 02:17, 29-01-2018 | #2173


Новый участник


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

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


Flix,
Огромная благодарность, неделю искал выход из этой ситуации.

Последний раз редактировалось skinny21, 29-01-2018 в 19:03.


Отправлено: 09:43, 29-01-2018 | #2174


Аватара для Alex S

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


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

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


Мужики, добрый день. Помогите с кодом. Возникла проблема при создании информационной страницы. Идея такова: в зависимости от выбранного языка на странице (в Control EDIT) должен показаться текст из текстового файла соответствующего языка. То есть если выбран русский язык инсталлятора, то текст отображается из файла info_ru.txt, если английский язык, то текст отображается из файла info_en.txt. Возник ряд проблем, при чтении из текстового файла (FileOpen-FileRead) текст отображается с крякозябликами и считывается только первая строка.
Что есть сейчас
!define PRODUCT_NAME "MyProg"

Var InfoPage
Var InfoBeforePage_Control_EDIT

!include "MUI2.nsh"
!include "nsDialogs.nsh"
!include "LogicLib.nsh"

Page custom InfoBeforePage
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Russian"


Name "${PRODUCT_NAME}"
OutFile "InfoBeforePage.exe"

Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
InitPluginsDir
;${If} ${LANG_RUSSIAN}
File "/oname=$PLUGINSDIR\info.txt" "info_ru.txt"
; ${Else}
; File "/oname=$PLUGINSDIR\info.txt" "info_en.txt"
;${EndIf}
FileOpen $4 "$PLUGINSDIR\info.txt" r
FileRead $4 $1 ; Read a line
FileClose $4
FunctionEnd

Function InfoBeforePage
nsDialogs::Create 1018
Pop $InfoPage
${If} $InfoPage == error
Abort
${EndIf}
!insertmacro MUI_HEADER_TEXT "Dialog title..." "Dialog subtitle..."
!define MYMULTILINEEDIT_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_MULTILINE}|${ES_READONLY}
nsDialogs::CreateControl EDIT ${MYMULTILINEEDIT_STYLE} ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} 0u 0u 300u 140u "$1"
Pop $InfoBeforePage_Control_EDIT
nsDialogs::Show
FunctionEnd

Section "MainSection" SEC01
SectionEnd

Отправлено: 15:07, 29-01-2018 | #2175


Аватара для Flix

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


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

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


Цитата Alex S:
Возник ряд проблем, при чтении из текстового файла (FileOpen-FileRead) текст отображается с крякозябликами и считывается только первая строка. »
Почитайте в справке информацию по команде FileRead, а также ограничения её использования. Кратко укажу основные моменты, которые важно знать. Первое, текст должен быть в кодировке ANSI. Второе, длина строки не должна превышать 1024 символов. Третье, команда считывает только строку, а не весь документ.

Теперь по вашему сценарию. С учетом того, что команда считывает только строку, то необходимо организовать цикл с поочередным чтением всех строк до конца файла. После чтения каждой строки, её необходимо передавать элементу управления. Таким образом, в простейшем варианте эту задачу можно выполнить так (на базе вашего сценария):

Вариант решения

Код: Выделить весь код
!define PRODUCT_NAME "MyProg"

Var InfoPage
Var InfoBeforePage_Control_EDIT

!include "MUI2.nsh"
!include "nsDialogs.nsh"
!include "LogicLib.nsh"

;--------------------------------
;General

  Name "${PRODUCT_NAME}"
  OutFile "InfoBeforePage.exe"

;--------------------------------
;Interface Settings

  !define MUI_ABORTWARNING

  ;Show all languages, despite user's codepage
  !define MUI_LANGDLL_ALLLANGUAGES

;--------------------------------
;Pages
  Page custom InfoBeforePage
  !insertmacro MUI_PAGE_INSTFILES

;--------------------------------
;Languages
  !insertmacro MUI_LANGUAGE "English"
  !insertmacro MUI_LANGUAGE "Russian"

;--------------------------------
;Installer Sections
Section "MainSection" SEC01
SectionEnd

;--------------------------------
;Installer Functions
Function .onInit

  !insertmacro MUI_LANGDLL_DISPLAY
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  ${If} $LANGUAGE = ${LANG_RUSSIAN}
    ; Документ должен быть в кодировке  ANSI !!!
    File /oname=$PLUGINSDIR\info.txt info_ru.txt
  ${Else}
    ; Документ должен быть в кодировке  ANSI !!!
    File /oname=$PLUGINSDIR\info.txt" info_en.txt
  ${EndIf}

FunctionEnd

Function InfoBeforePage

  nsDialogs::Create 1018
  Pop $InfoPage
  ${If} $InfoPage == error
    Abort
  ${EndIf}
  !insertmacro MUI_HEADER_TEXT "Dialog title..." "Dialog subtitle..."

  ; === RichText1 (type: RichText) ===
  !define MYMULTILINEEDIT_STYLE ${WS_VISIBLE}|${WS_CHILD}|${WS_TABSTOP}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}
  nsDialogs::CreateControl "RichEdit20A" ${MYMULTILINEEDIT_STYLE} ${WS_EX_STATICEDGE} 0u 0u 300u 140u ""
  Pop $InfoBeforePage_Control_EDIT

  ; === Чтение файла ===
  Call ReadTxtFile

  nsDialogs::Show

FunctionEnd

; Функция чтения и вывода содержимого файла в элемент "RichEdit20A"
Function ReadTxtFile

  ; Открываем файл для чтения
  FileOpen $4 "$PLUGINSDIR\info.txt" r
  loop:
    ; Считываем строку в переменную $1
    FileRead $4 $1
    ; Передаем строку в элемент "RichEdit20A"
    ; Флаг ${EM_REPLACESEL} указывает на вставку текста с новой строки
    SendMessage $InfoBeforePage_Control_EDIT ${EM_REPLACESEL} 0 "STR:$1"
    ; Если нет ошибок, переходим к следующей строке
    IfErrors +1 loop
    ; Если ошибка или конец файла, закрываем файл.
  FileClose $4

FunctionEnd

Если необходимо чтение документов в кодировке Unicode, то посмотрите в сторону команды FileReadUTF16LE.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:06, 29-01-2018 | #2176


Аватара для Alex S

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


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

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


Flix, респект тебе и уважуха. Выручил...

Отправлено: 18:38, 29-01-2018 | #2177

MKN MKN вне форума

Ветеран


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

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


Цитата Alex S:
должен показаться текст из текстового файла »
Можно упростить код, если использовать не текстовый, а HTML файл (причём любой кодировки и можно с картинками).
Для этого есть несколько плагинов, к примеру, самый известный - WebCtrl.

Комплект примера во вложении.

Выглядеть будет так :


окно для просмотра можно делать ессно любым способом (наверное лучше через nsDialogs::CreateControl)...

Последний раз редактировалось MKN, 27-05-2020 в 16:17.

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

Отправлено: 11:43, 30-01-2018 | #2178


Аватара для Alex S

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


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

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


MKN , спасибо! Действительно кода в половину меньше...

Отправлено: 11:51, 30-01-2018 | #2179

MKN MKN вне форума

Ветеран


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

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


К слову, об ограничении FileRead на 1024 символа...
Для ANSI это ограничение можно снять с помощью сообщения EM_LIMITTEXT

К примеру, для вот этого текста ( https://yadi.sk/d/1cLhpTrv3Rukjv )
без EM_LIMITTEXT отображаются только 512 строк, а с EM_LIMITTEXT - все 13229 строк. Еснно такой большой объём долго обрабатывается...

Пример :

Код: Выделить весь код
OutFile EM_LIMITTEXT-test.exe
!include MUI2.nsh

Page custom MyPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Function MyPage
nsDialogs::Create 1044
Pop $0
nsDialogs::CreateControl ${__NSD_Text_CLASS} ${__NSD_Text_STYLE}|${ES_MULTILINE}|${WS_VSCROLL}|${ES_READONLY} ${__NSD_Text_EXSTYLE} 10u 10u 310u 170u ""
Pop $0
FileOpen $4 "$EXEDIR\test.txt" r   
loop:
    FileRead $4 $1
    SendMessage $0 ${EM_REPLACESEL} 0 "STR:$1"
	SendMessage $0 ${EM_LIMITTEXT} 0 "STR:$1"
    IfErrors +1 loop
FileClose $4
nsDialogs::Show
FunctionEnd

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

Отправлено: 13:01, 30-01-2018 | #2180



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




 
Переход