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

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

Закрытая тема
Настройки темы
[архив].: NSIS - все вопросы :.

Аватара для kotkovets

Ветеран


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


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

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


Изменения
Автор: volk1234
Дата: 09-12-2012
Описание: перевод темы в архив.
Тема закрыта!
Лимит страниц.
Продолжение тут:
.: NSIS - все вопросы :. часть 2.
Старая шапка:
читать дальше »

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

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


Текущая версия: 2.46 от 6 декабря 2009 года
Скачать | Архив сборок версии 2 | Архив сборок версии 1

ВНИМАНИЕ! Созданный в NSIS инсталлятор является ANSI-приложением. Есть возможность использовать UNICODE-сборку системы, но при этом ваши дистрибутивы не будут работать в ANSI-системах, таких, как Windows 9x. Для загрузки UNICODE-сборки системы посетите сайт: http://www.scratchpaper.com/

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

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

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

Плагины и полезности к NSIS: http://nsis.sourceforge.net/Category:Plugins

Интерфейс Venis GUI: http://www.spaceblue.com/products/venis
Интерфейс ExperienceUI GUI http://experienceui.xx0r.info/oldeng...erienceui/home
Пример:


Интерфейс SkinCrafter Plugin - http://www.skincrafter.com/
Пример:

Инструкция по использованию от K.A.V.

Примеры скриптов на нашем форуме
Скрипт 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, если хотите скрыть некоторые файлы в вашей инсталляции.


===========
тема прикрепляется, шапка будет дорабатыватся... Volk1234, hb860

Отправлено: 23:35, 17-06-2006

 

Аватара для K.A.V.

Ленивый кусок мяса


Contributor


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

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


Цитата wolkow70:
Товарищи, рельно ли средствами NSIS в файле opera_install_log.xml все пути C:\Program Files\Opera поменять на путь прописанный в $INSTDIR или нет? »
Реально

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]


Отправлено: 13:27, 11-04-2012 | #2521



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

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

MKN MKN вне форума

Ветеран


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

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


Возвращаясь к вышеразбираемому вопросу с определением Provider=* в длинющей строке :

Можно и так :
Код: Выделить весь код
Section

;Provider= может находится и в начале
;StrCpy $0 "Provider=SQLOLEDB;Data Source=W2K3SP2\SQLEXPRESS;Initial Catalog=user_db;Persist Security Info=True;User ID=user;Password=user;"

; и  в середине строки

StrCpy $0 "Data Source=W2K3SP2\SQLEXPRESS;Initial Catalog=user_db;Provider=SQLOLEDB;Persist Security Info=True;User ID=user;Password=user;"

${WordFind2X} "$0" "Provider=" ";" "+1" $1

MessageBox MB_OK "$1"   
; В $1 будет SQLOLEDB

SectionEnd
Для сокращения кода строку можно и не заносить в переменную... Хотя может это и дурной тон...

Последний раз редактировалось MKN, 11-04-2012 в 13:37.

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

Отправлено: 13:30, 11-04-2012 | #2522


Аватара для wolkow70

Ветеран


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

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


Цитата K.A.V.:
Реально »
Обнадеживает. Где можно почитать на счет этого. Это же не простой текстовый файл, а .xml ?

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


Последний раз редактировалось wolkow70, 11-04-2012 в 13:52.


Отправлено: 13:44, 11-04-2012 | #2523


Аватара для kotkovets

Ветеран


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

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


wolkow70, в шапке пример парсинга xml
или макросами Word* в папке примеров - большая куча примеров.

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


Отправлено: 14:09, 11-04-2012 | #2524


Аватара для K.A.V.

Ленивый кусок мяса


Contributor


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

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


Цитата wolkow70:
Обнадеживает »
Как спросили, так и ответил

Цитата wolkow70:
Это же не простой текстовый файл, а .xml ? »
Откройте его блокнотом - обычный текстовый файл со множеством строк

Кстати я хотел добавить в справочник пример данного кода (недавно реализовывал для одного проекта)
Чуть причесал и вот сюда выкладываю

Скрипт построчно читает в текстовом файле строки и заменяет определённый текст в строке на ваш
читать дальше »

В начале кода:
Код: Выделить весь код
!include "StrFunc.nsh"
!include "WinMessages.nsh"
${StrRep}
Функция поиска и замены фразы в текстовом файле
Код: Выделить весь код
Function ReplaceLinesInFile
  Banner::show /NOUNLOAD ""
  Banner::getWindow /NOUNLOAD
        Pop $1
     GetDlgItem $2 $1 1030
; Создаём баннер, чтобы видеть прогресс (для наглядности)

Var /Global _FindInFile ; В эту переменную поместим полный путь к файлу, в котором будем производить замену
Var /Global _LineReplace ; В эту переменную поместим строку, которую будем искать и заменять
Var /Global _LineToInsert ; В эту переменную поместим строку, НА которую мы будем заменять искомую строку
Var /Global _CurLineNumber ; В этой переменной храним номер обрабатываемой строки
Var /Global _CurLine ; В этой переменной храним строку, с которой в данный момент сверяем
Var /Global _LineNumbers ; В этой переменной храним количество строк в искомом файле

StrCpy $_FindInFile '$EXEDIR\opera_install_log.xml' ; Заменяем строки в этом файле
StrCpy $_LineReplace 'C:\Program Files\Opera' ; Ищем и заменяем ЭТУ строку
StrCpy $_LineToInsert '$EXEDIR' ; На что будем заменять

${LineSum} "$_FindInFile" $_LineNumbers ; Подсчитываем количество строк
strcpy $_CurLineNumber 0
startLineRead:
intop $_CurLineNumber $_CurLineNumber + 1

     SendMessage $2 ${WM_SETTEXT} 0 "STR:Обработка строки $_CurLineNumber [Всего: $_LineNumbers]" ; Смотрим прогресс обработки строк =)

IntCmp $_CurLineNumber $_LineNumbers 0 0 endFunc ; Если номер текущей строки больше количества строк в файле - поиск завершен

${LineRead} "$_FindInFile" "$_CurLineNumber" $_CurLine ; Читаем строку по номеру текущей строки
${WordFind} '$_CurLine' "$_LineReplace" "E+1{" $R0 ; Ищем в строке нужный текст

StrCmp $R0 "1" startLineRead 0 ; Если в строке присутствует искомый текст, выполняем код ниже
${LineFind} "$_FindInFile" "" "" "Insert_Line" ; Вызываем функцию Insert_Line, которая произведёт замену
goto startLineRead
endFunc:

  Banner::destroy ; Уничтожаем баннер
FunctionEnd


Function Insert_Line
StrCmp $R8 "$_CurLineNumber" 0 push
        ${StrRep} $_CurLine "$_CurLine" "$_LineReplace" "$_LineToInsert"
	FileWrite $R4 "$_CurLine"
	StrCpy $0 SkipWrite
	push:
	Push $0
FunctionEnd

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]

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

Отправлено: 14:16, 11-04-2012 | #2525


Аватара для wolkow70

Ветеран


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

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


Цитата kotkovets:
wolkow70, в шапке пример парсинга xml
или макросами Word* в папке примеров - большая куча примеров. »

Примерно так, да?

!include "XML.nsh"

SetOutPath "$INSTDIR"
${xml::LoadFile} "$INSTDIR\opera_install_log.xml" $0
${xml::GotoPath} "C:\Program Files\Opera" $0
${xml::SetAttribute} "pathPrefix" "$INSTDIR\" $0
${xml::SaveFile} "" $0
${xml::Unload}

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


Отправлено: 14:31, 11-04-2012 | #2526


Аватара для DruOleg

Старожил


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

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


Спасибо все за рецепты, сделал так
Код: Выделить весь код
;Тип СУБД
StrCpy $DB_type "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_type" ";" "+1" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "Provider="                  ;вычисляем длину отсекаемой части
StrCpy $DB_type "$3" "" $1                   ;отсекаем 

;Сервер БД
StrCpy $DB_server "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_server" ";" "+2" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "Data Source="                  ;вычисляем длину отсекаемой части
StrCpy $DB_server "$3" "" $1                   ;отсекаем 

;Имя БД
StrCpy $DB_name "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_name" ";" "+3" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "Initial Catalog="                  ;вычисляем длину отсекаемой части
StrCpy $DB_name "$3" "" $1                   ;отсекаем 

;Логин пользователя БД
StrCpy $DB_user "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_user" ";" "+5" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "User ID="                  ;вычисляем длину отсекаемой части
StrCpy $DB_user "$3" "" $1                   ;отсекаем 

;Пароль пользователя БД
StrCpy $DB_password "$connect_string" ;присваиваем строку подключения
${WordFind} "$DB_password" ";" "+6" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "Password="                  ;вычисляем длину отсекаемой части
StrCpy $DB_password "$3" "" $1                   ;отсекаем 

;Определяем тип СУБД: MS SQL или Firebird
${If} $DB_type == "SQLOLEDB"
   StrCpy $DB_type "MS SQL"
   ExecWait "sqlcmd.exe -S $DB_server -d $DB_name -U $DB_user -P $DB_password -i get_version.sql"
${ElseIf} $DB_type == "LCPI.IBProvider"
   StrCpy $DB_type "Firebird"
${Else}
   MessageBox MB_OK "Не удалось определить тип СУБД!!!"
   ;Abort
${EndIf}
Хотел еще спросить как присвоить значение переменной:
ExecWait "sqlcmd.exe -S $DB_server -d $DB_name -U $DB_user -P $DB_password -i get_version.sql"

Запрос:
SELECT REV FROM VERSN - возвращает обычное число... Его и нужно сравнить с числом 14525.

Отправлено: 16:07, 11-04-2012 | #2527


Аватара для wolkow70

Ветеран


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

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


K.A.V.,
Попробовал применить приведенную вами функцию. Все работает.

Возникло два вопроса:

1. Если нужно заменить еще значение - назначать новую функцию?
2. Что закомментировать, что бы не было баннера в режиме тихой установки?

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


Отправлено: 16:29, 11-04-2012 | #2528


Аватара для K.A.V.

Ленивый кусок мяса


Contributor


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

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


wolkow70, сделайте так:

В начале кода
Код: Выделить весь код
Var _FindInFile ; В эту переменную поместим полный путь к файлу, в котором будем производить замену
Var _LineReplace ; В эту переменную поместим строку, которую будем искать и заменять
Var _LineToInsert ; В эту переменную поместим строку, НА которую мы будем заменять искомую строку
Var _CurLineNumber ; В этой переменной храним номер обрабатываемой строки
Var _CurLine ; В этой переменной храним строку, с которой в данный момент сверяем
Var _LineNumbers ; В этой переменной храним количество строк в искомом файле

!include "StrFunc.nsh"
${StrRep}

В любой секции или функции вызываем функцию сколько угодно раз, только перед новой заменой, если данные отличаются (в каком файле и что заменить) назначайте переменным новые значения
Код: Выделить весь код
Section /o "Моя секция"
StrCpy $_FindInFile '$EXEDIR\opera_install_log.xml' ; Заменяем строки в этом файле
StrCpy $_LineReplace 'C:\Program Files\Opera' ; Ищем и заменяем ЭТУ строку
StrCpy $_LineToInsert '$EXEDIR' ; На что будем заменять
call ReplaceLinesInFile
SectionEnd

Function ReplaceLinesInFile
${LineSum} "$_FindInFile" $_LineNumbers ; Подсчитываем количество строк
strcpy $_CurLineNumber 0
startLineRead:
intop $_CurLineNumber $_CurLineNumber + 1
IntCmp $_CurLineNumber $_LineNumbers 0 0 endFunc ; Если номер текущей строки больше количества строк в файле - поиск завершен
${LineRead} "$_FindInFile" "$_CurLineNumber" $_CurLine ; Читаем строку по номеру текущей строки
${WordFind} '$_CurLine' "$_LineReplace" "E+1{" $R0 ; Ищем в строке нужный текст
StrCmp $R0 "1" startLineRead 0 ; Если в строке присутствует искомый текст, выполняем код ниже
${LineFind} "$_FindInFile" "" "" "Insert_Line" ; Вызываем функцию Insert_Line, которая произведёт замену
goto startLineRead
endFunc:
FunctionEnd

Function Insert_Line
StrCmp $R8 "$_CurLineNumber" 0 push
        ${StrRep} $_CurLine "$_CurLine" "$_LineReplace" "$_LineToInsert"
	FileWrite $R4 "$_CurLine"
	StrCpy $0 SkipWrite
	push:
	Push $0
FunctionEnd

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]

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

Отправлено: 16:56, 11-04-2012 | #2529

MKN MKN вне форума

Ветеран


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

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


Напомните пожалуйста, каким образом средствами NSIS манипулировать (удалять, заменять, разрегистрировать) "занятые" системой файлы и ключи реестра.
Например, надо разрегистрировать и удалить файлы Adobe Acrobat Reader_а (надо подчистить "хвосты" после неудачного удаления ПО, перед последующей установкой. Такое часто необходимо.) :

\Program Files\Common Files\Adobe\Acrobat\ActiveX\AcroIEHelper.dll и удалить записи его ключей в реестре и др. подобные файлы...
"классически" разрегистрировать и удалить этот файл не возможно...
(Куча ручных действий с выставлением прав - ессно не годится.)

Помнится был способ с назначением системных прав с полным доступом к файлу и рестартом оболочек (Эксплорера или Тотала) Не нахожу никак эту инфу... Желательно без сторонних средств (в смысле, без доп. утилит и дремучих досовских команд). Интересует способ для любых версий ОС.

kotkovets, наверняка решил бы эту проблему средствами API...

Последний раз редактировалось MKN, 11-04-2012 в 18:34.


Отправлено: 18:15, 11-04-2012 | #2530



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Мультимедиа - WinAmp .:[ обсуждение всех версий ]:. ssaram Программное обеспечение Windows 406 12-02-2022 19:45
WinstyleMonitor .:[все вопросы]:. Mr dUSHA Проект WinStyle 331 12-02-2014 13:15
Delphi - Delphi .: [все вопросы] :. Serega Программирование и базы данных 94 04-05-2013 18:45
Доступ - Никак не удаляются файлы (AVI и все остальные форматы) .:[все вопросы]:. Microsoft Windows 2000/XP 105 30-06-2010 11:58
Вопросы по создателю инсталляций NSIS MaxDELETE Программное обеспечение Windows 14 04-07-2007 10:01




 
Переход