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

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

 

Старожил


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

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


Пример из справочника плох тем, что он немного неправильный по части реализации и устаревший (${NSIS_VERSION} < 3 && ANSI).

Базовый пример для проверки на запуск копии приложения есть в базовой справке.
Более правильный пример с автопереключеніем на уже запущенную копию есть на сайте - Allow only one installer instance.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:39, 02-04-2023 | #2701



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

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


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


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

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


iglezz, приветствую.
Цитата:
Простейший цикл последовательного чтения файла:
Код

FileOpen $handle $filename R
${Do}
FileRead $handle $fileread
${IfThen} ${Errors} ${|} ${ExitDo} ${|}

DetailPrint '[$fileread]'
${Loop}
FileClose $handle
Ничего не получается. Можете показать пример поиска конкретной записи, вот как в этом цикле:

FileOpen $0 "test.txt" R
${LineSum} "test.txt" $R0
StrCpy $R1 0
readnext:
IntOp $R1 $R1 + 1
IntCmp $R1 $R0 0 0 end
${LineRead} "test.txt" "$R1" $R3
${WordFind} "$R3" "test-test" "E+1{" $R2
IfErrors readnext 0
MessageBox MB_OK "Найдена фраза ( test-test )"
end:
FileClose $0

Последний раз редактировалось inco1, 07-04-2023 в 12:35.


Отправлено: 03:22, 07-04-2023 | #2702


Старожил


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

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


Пример под спойлером годится для извлечения/поиска информации, для [пере]записи будет несколько по другому.

пример
Код: Выделить весь код
ShowInstDetails show
RequestExecutionLevel user


!include Util.nsh
!include LogicLib.nsh
!include StrFunc.nsh
${Using:StrFunc} StrLoc


!define FileReadAuto `!insertmacro FileReadAuto`
!macro FileReadAuto ISUTF16LE HANDLE READLINE
    StrCmp ${ISUTF16LE} 0 0 +3
    FileRead ${HANDLE} ${READLINE}
    Goto +2
    FileReadUTF16LE ${HANDLE} ${READLINE}
!macroend

!define FileFindStrStruct `(i, i, &t${NSIS_MAX_STRLEN}) p`
/*  {
    номер строки (начинается с 1),
    позиция искомого в строке (начинается с 0),
    строка, содержащая искомую строку
    }
*/
!define FileFindStr `!insertmacro FileFindStr`
!macro FileFindStr OUTPUT FILENAME STRTOFIND
    Push '${STRTOFIND}'
    Push '${FILENAME}'
    ${CallArtificialFunction} FileFindStr_macro
    Pop ${OUTPUT}
!macroend
!macro FileFindStr_macro
    Exch $0 ; [in] FileName / [out] ReturnStructAddr
    Exch
    Exch $1 ; StrToFind
    Push $2 ; FileHandle
    Push $3 ; ISUTF16LEFlag
    Push $4 ; ReadData
    Push $5 ; StrToFindLine
    Push $6 ; StrToFindPosInLine
    Push $7 ; ReturnStructAddr

    ; инициализация переменных
    StrCpy $5 0 ; Reset Line counter
    StrCpy $7 0 ; Reset ReturnStructAddr

    FileOpen $2 $0 R
    IfErrors FileFindStr_macro_end

    ; определение читающей инструкции (FileRead | FileReadUTF16LE)
    FileReadWord $2 $4
    ${If} $4 = 0xFEFF
        StrCpy $3 1
    ${Else}
        StrCpy $3 0
    ${EndIf}
    FileSeek $2 0 SET

    ; основной цикл построчного чтения файла
    ${Do} 
        ${FileReadAuto} $3 $2 $4
        ${IfThen} ${Errors} ${|} ${ExitDo} ${|}

        IntOp $5 $5 + 1

        ${StrLoc} $6 $4 $1 >
        ${If} $6 != ''
            ; если строка найдена -> пишем результат в структуру ..
            System::Call '*${FileFindStrStruct} (r5, r6, r4) .r7'
            ; .. и выходим
            ${ExitDo}
        ${EndIf}
    ${Loop}
    FileClose $2

    FileFindStr_macro_end:
    StrCpy $0 $7

    Pop $7
    Pop $6
    Pop $5
    Pop $4
    Pop $3
    Pop $2
    Pop $1
    Exch $0
!macroend


Section
    ${FileFindStr} $0 '${NSISDIR}\Include\StrFunc.nsh' 'macro '
    ${If} $0 <> 0
        ; распаковка структуры
        System::Call '*$0${FileFindStrStruct} (.r1, .r2, .r3)'
        
        DetailPrint 'Line: $1'
        DetailPrint 'Pos: $2'
        DetailPrint 'Str: $3'
    ${EndIf}
SectionEnd

Последний раз редактировалось iglezz, 07-04-2023 в 17:06.

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

Отправлено: 13:09, 07-04-2023 | #2703


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


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

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


iglezz, Спасибо за пример, но я так вообще и не понял, как к этому примеру прикрутить мой файл "test.txt" и искомую фразу "test-test", как в моём примере выше.

Отправлено: 16:42, 07-04-2023 | #2704


Старожил


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

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


inco1,
В этом примере
Код: Выделить весь код
${FileFindStr} результат файл строка
если строка найдена, то результат будет отличен от нуля
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:09, 07-04-2023 | #2705


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


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

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


iglezz, еще раз благодарю. Долго же до меня доходят очевидные вещи. Видать возраст.

Отправлено: 17:37, 07-04-2023 | #2706


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


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

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


Еще такой интересный вопрос. Как правильно сравнить две переменные?
Например, есть переменные $R5 и $R6. В обеих есть некое значение из цифр и английских букв. Это неизвестное значение может быть, как одинаковым, так и разным.
Код, что ниже не работает, хотя я для теста специально ставил в переменные одинаковые значения - "0x03e700ff" , а показывало $R5 != "0x03e700ff", а когда менял местами $R5 и $R6, то показывало $R6 != "0x03e700ff". Что подтверждает, что значения в переменных одинаковы.

Код: Выделить весь код
StrCmp $R5 "$R6" 0 +3
DetailPrint '$$R5 == "$R6"'
Goto +2
DetailPrint '$$R5 != "$R6"'
Что еще можно использовать для данной ситуации?

Отправлено: 20:10, 07-04-2023 | #2707


Старожил


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

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


Цитата inco1:
Код, что ниже не работает, хотя ..»
Должен работать. Если не работает, значит есть малозаметная ошибка/опечатка.

Цитата inco1:
Как правильно сравнить две переменные? »
В NSIS любая переменная хранится как строка, для для манипуляций с числами эта строка преобразуется в число.
StrCmp для чисел подходит только в случае, когда гарантированно совпадёт система счисления. Число 16 (десятичное) может быть записано как 0x10 (шестнадцатеричная) или 020 (восьмеричная) и для IntCmp все эти формы одинаковы.

Отправлено: 21:58, 07-04-2023 | #2708


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


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

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


iglezz,

Ну да, должен работать, но не работает. Вот с этого кода скомпилите экзешник и сами убедитесь:


Код: Выделить весь код
                 RequestExecutionLevel user
		OutFile "test.exe"

                !include "LogicLib.nsh"
                !include "WordFunc.nsh"
                !include "TextFunc.nsh"

Function .onInit

    StrCpy $R6 "c:\"
    System::Call 'Kernel32::GetVolumeInformation(t "$R6",t.r3,i ${NSIS_MAX_STRLEN},*i,*i,*i.r1,t.r2,i ${NSIS_MAX_STRLEN})i.r0'
      ${If} $0 <> 0
    IntFmt $1 "%#.8x" $1
    StrCpy $R7 "$1"
      ${EndIf}

      ${LineSum} "Info.txt" $R0
    StrCpy $R1 0
    IntOp $R1 $R1 + 1
    IntCmp $R1 $R0 0 0 end
      ${LineRead} "Info.txt" "$R1" $R3
     end:

    StrCpy $R8 "$R3"

FunctionEnd


Section Message

           MessageBox MB_OK "    1значение  $R7  -  2значение  $R8  "

StrCmp $R7 "$R8" Well Unequal 
Well:
  MessageBox MB_OK "Значения равны"
  Goto Next
Unequal:
  MessageBox MB_OK "Значения не равны"
Next:

    StrCmp $R7 '$R8' 0 +3
DetailPrint '$$R7 == "$R8"'
    Goto +2
DetailPrint '$$R7 != "$R8"'

SectionEnd

Section File

    FileOpen $0 "Info.txt" w
    FileWrite $0 "$R7$\r$\n"
    FileClose $0

SectionEnd
Первый запуск не считается, потому что еще не будет файла Info.txt. А вот второй запуск в сообщении визуально покажет, что переменные бы равны, но по двум кодам сравнения через StrCmp $R7 '$R8' покажет, что совсем не равны.

Отправлено: 22:54, 07-04-2023 | #2709


Старожил


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

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


inco1, Достаточно заменить MessageBox на такой
Код: Выделить весь код
MessageBox MB_OK "[$R7]$\n[$R8]"
и сразу станет видна причина - строка считывается с файла вместе с символами окончания строки (\r\n)
Прочитанную из файла строку надо чистить от них (TrimNewLines в TextFunc.nsh)
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:10, 07-04-2023 | #2710



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




 
Переход