Ru-Board.club
← Вернуться в раздел «Программы»

» NSIS (Nullsoft Scriptable Install System)

Автор: Victor_VG
Дата сообщения: 06.11.2015 10:33
megane68

Иначе бы не прислал. После я его оттуда уберу - он у меня вечно в доработке по мере надобности.
Автор: megane68
Дата сообщения: 06.11.2015 16:45
Victor_VG
Блин, я точно лох. Не могу разобраться в твоём примере, что да как.


Добавлено:
Victor_VG
Может можно как- то на моём примере трёх секций показать? А то блин столько лишнего в твоём сценарии, что мне не врубиться.
Автор: megane68
Дата сообщения: 06.11.2015 20:45
Ага, нащупал потихоньку логику. )))
Автор: MKN
Дата сообщения: 07.11.2015 09:04
megane68

Цитата:
Нужно, чтобы при выборе SEC03 или SEC04 секции, как обязаловка включалась секция SEC02.


Цитата:
нащупал потихоньку логику.

Проще "нащупать логику", если в Function .onSelChange использовать классическую логику :

Цитата:

outfile onSelChange-test.exe
!include "MUI2.nsh"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Section /o "sec02" SEC02
SectionEnd
Section /o "sec03" SEC03
SectionEnd
Section /o "sec04" SEC04
SectionEnd

Function .onSelChange
SectionGetFlags ${SEC03} $3
SectionGetFlags ${SEC04} $4
${If} $3 == 1
${OrIf} $4 == 1
SectionSetFlags ${SEC02} 1
${EndIf}
FunctionEnd
Автор: megane68
Дата сообщения: 07.11.2015 09:35
MKN
Я с другой стороны подошёл, а сейчас чешу репу как мне зависимость кнопок сделать?
В общем смысл такой - имеются две субсекции, в которых по три секции. Первая субсекция независима от второй. При выборе второй и третьей секции, должна включаться всегда первая секция.
Вторая субсекция из 4, 5 и 6 секции.
При выборе 5-ой секции, должны включаться 1,-ая, 2-ая, 3-яя, 4-ая, .
При выборе 6-ой секции, должна включаться только 4-ая.

Сейчас в своём сценарии не могу сделать точно такую зависимость. Выглядит он так:


Цитата:

Name SectionDependency
OutFile SectionDependency.exe

Var IndependentSectionState


Page Components

!include Sections.nsh

Section "Section 1" SEC01
SetOutPath "$INSTDIR\"
SectionIn RO
SectionEnd

Section "Section 2" SEC02
SetOutPath "$INSTDIR\"
SectionIn RO
SectionEnd

SubSection "Субсекция 1" SUBSEC01

Section "Section 3" SEC03
SetOutPath "$INSTDIR\"
SectionEnd

Section /o "Section 4" SEC04
SetOutPath "$INSTDIR\"
SectionEnd

Section /o "Section 5" SEC05
SetOutPath "$INSTDIR\"
SectionEnd

SubSectionEnd

SubSection "Субсекция 2" SUBSEC02

Section "Section 6" SEC06
SetOutPath "$INSTDIR\"
SectionEnd

Section /o "Section 7" SEC07
SetOutPath "$INSTDIR\"
SectionEnd

Section /o "Section 8" SEC08
SetOutPath "$INSTDIR\"
SectionEnd

SubSectionEnd

Function .onInit

# This is necessary otherwise SEC03 won't be selectable for the first time you click it.
SectionGetFlags ${SEC03} $R0
IntOp $R0 $R0 & ${SF_SELECTED}
StrCpy $IndependentSectionState $R0

SectionGetFlags ${SEC06} $R0
IntOp $R0 $R0 & ${SF_SELECTED}
StrCpy $IndependentSectionState $R0


FunctionEnd

Function .onSelChange
Push $R0
Push $R1

# Check if SEC03 was just selected then select SEC04 and SEC05.
SectionGetFlags ${SEC03} $R0
IntOp $R0 $R0 & ${SF_SELECTED}
StrCmp $R0 $IndependentSectionState +3
StrCpy $IndependentSectionState $R0
Goto UnselectDependentSections
StrCpy $IndependentSectionState $R0
    
Goto CheckDependentSections
    
; # Check if SEC06 was just selected then select SEC07 and SEC08.
; SectionGetFlags ${SEC06} $R0
; IntOp $R0 $R0 & ${SF_SELECTED}
; StrCmp $R0 $IndependentSectionState +3
; StrCpy $IndependentSectionState $R0
; Goto UnselectDependentSections
; StrCpy $IndependentSectionState $R0

; Goto CheckDependentSections

; # Check if SEC06 was just selected then select SEC07 and SEC08.
; SectionGetFlags ${SEC07} $R0
; IntOp $R0 $R0 & ${SF_SELECTED}
; StrCmp $R0 $IndependentSectionState +3
; StrCpy $IndependentSectionState $R0
; Goto UnselectDependentSections
; StrCpy $IndependentSectionState $R0

; Goto CheckDependentSections

# Select SEC03 if SEC04 or SEC05 was selected.
SelectIndependentSection:

SectionGetFlags ${SEC03} $R0
IntOp $R1 $R0 & ${SF_SELECTED}
StrCmp $R1 ${SF_SELECTED} +3

IntOp $R0 $R0 | ${SF_SELECTED}
SectionSetFlags ${SEC03} $R0

StrCpy $IndependentSectionState ${SF_SELECTED}

SectionGetFlags ${SEC06} $R0
IntOp $R1 $R0 & ${SF_SELECTED}
StrCmp $R1 ${SF_SELECTED} +3

IntOp $R0 $R0 | ${SF_SELECTED}
SectionSetFlags ${SEC06} $R0

StrCpy $IndependentSectionState ${SF_SELECTED}
    
SectionGetFlags ${SEC04} $R0
IntOp $R1 $R0 & ${SF_SELECTED}
StrCmp $R1 ${SF_SELECTED} +3

IntOp $R0 $R0 | ${SF_SELECTED}
SectionSetFlags ${SEC04} $R0

StrCpy $IndependentSectionState ${SF_SELECTED}
    
SectionGetFlags ${SEC05} $R0
IntOp $R1 $R0 & ${SF_SELECTED}
StrCmp $R1 ${SF_SELECTED} +3

IntOp $R0 $R0 | ${SF_SELECTED}
SectionSetFlags ${SEC05} $R0

StrCpy $IndependentSectionState ${SF_SELECTED}

Goto End

# Were Sec3 or Sec4 just unselected?
CheckDependentSections:

SectionGetFlags ${SEC04} $R0
IntOp $R0 $R0 & ${SF_SELECTED}
StrCmp $R0 ${SF_SELECTED} SelectIndependentSection

SectionGetFlags ${SEC05} $R0
IntOp $R0 $R0 & ${SF_SELECTED}
StrCmp $R0 ${SF_SELECTED} SelectIndependentSection

; Goto End

SectionGetFlags ${SEC07} $R0
IntOp $R0 $R0 & ${SF_SELECTED}
StrCmp $R0 ${SF_SELECTED} SelectIndependentSection

SectionGetFlags ${SEC08} $R0
IntOp $R0 $R0 & ${SF_SELECTED}
StrCmp $R0 ${SF_SELECTED} SelectIndependentSection

Goto End

# Unselect Sec3 and Sec4 if Sec2 was unselected.
UnselectDependentSections:

SectionGetFlags ${SEC04} $R0
IntOp $R1 $R0 & ${SF_SELECTED}
StrCmp $R1 ${SF_SELECTED} 0 +3

IntOp $R0 $R0 ^ ${SF_SELECTED}
SectionSetFlags ${SEC04} $R0

SectionGetFlags ${SEC05} $R0
IntOp $R1 $R0 & ${SF_SELECTED}
StrCmp $R1 ${SF_SELECTED} 0 +3

IntOp $R0 $R0 ^ ${SF_SELECTED}
SectionSetFlags ${SEC05} $R0
    
SectionGetFlags ${SEC07} $R0
IntOp $R1 $R0 & ${SF_SELECTED}
StrCmp $R1 ${SF_SELECTED} 0 +3

IntOp $R0 $R0 ^ ${SF_SELECTED}
SectionSetFlags ${SEC07} $R0

SectionGetFlags ${SEC08} $R0
IntOp $R1 $R0 & ${SF_SELECTED}
StrCmp $R1 ${SF_SELECTED} 0 +3

IntOp $R0 $R0 ^ ${SF_SELECTED}
SectionSetFlags ${SEC08} $R0
    
End:

Pop $R1
Pop $R0
FunctionEnd


Добавлено:
MKN
ПО вашему примеру, сделал отдел две субсекции.
Сейчас они работаю идентично.
Сложность в том, как привязать седьмую секцию к 3, 4, 5 и 6-ой секциям. При этом такая комбинация должен выполняться только при нажатии на седьмую секцию.

Цитата:

Page Components

!include Sections.nsh

Section "Section 1" SEC01
SetOutPath "$INSTDIR\"
SectionIn RO
SectionEnd

Section "Section 2" SEC02
SetOutPath "$INSTDIR\"
SectionIn RO
SectionEnd

SubSection "Субсекция 1" SUBSEC01

Section "Section 3" SEC03
SetOutPath "$INSTDIR\"
SectionEnd

Section /o "Section 4" SEC04
SetOutPath "$INSTDIR\"
SectionEnd

Section /o "Section 5" SEC05
SetOutPath "$INSTDIR\"
SectionEnd

SubSectionEnd

SubSection "Субсекция 2" SUBSEC02

Section "Section 6" SEC06
SetOutPath "$INSTDIR\"
SectionEnd

Section /o "Section 7" SEC07
SetOutPath "$INSTDIR\"
SectionEnd

Section /o "Section 8" SEC08
SetOutPath "$INSTDIR\"
SectionEnd

SubSectionEnd

Function .onSelChange
SectionGetFlags ${SEC04} $3
SectionGetFlags ${SEC05} $4
${If} $3 == 1
${OrIf} $4 == 1
SectionSetFlags ${SEC03} 1
${EndIf}

SectionGetFlags ${SEC07} $3
SectionGetFlags ${SEC08} $4
${If} $3 == 1
${OrIf} $4 == 1
SectionSetFlags ${SEC06} 1
${EndIf}
FunctionEnd
Автор: MKN
Дата сообщения: 07.11.2015 10:25
megane68
Ты как то путанно ставишь задачу.

Цитата:
При выборе 5-ой секции, должны включаться 1,-ая, 2-ая, 3-яя, 4-ая,

у тебя ведь 1 и 2 секции уже всегда включены принудительно - SectionIn RO для
"Section 1" SEC01 и "Section 2" SEC02
Или ты путаешь нумерацию секций и субсекций ?
Определи четко логику - если такая то секция отмечена, то такие то секции должны находится в таком то состоянии и т.д. И так - для всех секций.
Автор: megane68
Дата сообщения: 07.11.2015 10:44

Цитата:
у тебя ведь 1 и 2 секции уже всегда включены принудительно - SectionIn RO для

Это на тот случай, если пользователь захочет ручками влезть в настройки.
Короче, чтобы шаловливые руски не покопались, ибо есть зависимость компонентов. Без 3, 4, 5 и 6 компонетов, 7-ой работать не будет, и наоборот - 3, 4, 5 и 6-ой компоненты, без 7-ого прекрасно работают.

Добавлено:

Цитата:
Или ты путаешь нумерацию секций и субсекций ?

Путаю, каюсь.
Секции начинаются с 3 по 8-ую.
Автор: megane68
Дата сообщения: 07.11.2015 18:48
MKN
В результате вашим способом оказалось проще.
Вопрос с выбором компонентов решён.
Теперь надо решать вопрос с зависимостью при отмене выбора компонентов!


Цитата:

Function .onSelChange

# Select SEC03 if SEC04 or SEC05 was selected.
SectionGetFlags ${SEC04} $3
SectionGetFlags ${SEC05} $4
${If} $3 == 1
${OrIf} $4 == 1
SectionSetFlags ${SEC03} 1
${EndIf}

# Select SEC06 if SEC07 or SEC08 was selected.
SectionGetFlags ${SEC07} $3
SectionGetFlags ${SEC08} $4
${If} $3 == 1
${OrIf} $4 == 1
SectionSetFlags ${SEC06} 1
${EndIf}

# Select SEC03, SEC04, SEC05 and SEC06 if SEC07 was selected.
SectionGetFlags ${SEC07} $4
${If} $3 == 1
${OrIf} $4 == 1
SectionSetFlags ${SEC03} 1
SectionSetFlags ${SEC04} 1
SectionSetFlags ${SEC05} 1
SectionSetFlags ${SEC06} 1
${EndIf}

FunctionEnd
Автор: megane68
Дата сообщения: 08.11.2015 03:38
Подскажите, как выкрутиться?
Была кастомная страница с Radiobuttons для выбора типа установки (установка и update) и стандартная страница компонентов.
Захотелось сделать профили на странице выбора компонентов:

Цитата:
!define MUI_COMPONENTSPAGE_SMALLDESC
InstType "Полный"
InstType "Минимальный"
InstType "Рекомендуемый"


Но теперь перестал работать выбор из двух секций по RadioButton с кастомной страницы:


Цитата:

Function SetFlags
${NSD_GetState} $RadioButton1 $Radio1
${NSD_GetState} $RadioButton2 $Radio2

${If} $Radio1 = 1
SectionSetFlags ${Port} 0
SectionSetFlags ${St} 1
${EndIf}

${If} $Radio2 = 1
SectionSetFlags ${St} 0
SectionSetFlags ${Port} 1
${EndIf}
FunctionEnd


При любом варианте RadioButton, устанавливаются обе секции ${St} и ${Port}.

Как выключить секцию ${St} при выборе RadioButtob2?
Эти две кнопки RasioButton находятся на кастомной странице сценария. перед выбором компонентов, и для меня непонятно, как они связаны?
Автор: MKN
Дата сообщения: 10.11.2015 09:43
megane68

Цитата:
Теперь надо решать вопрос с зависимостью при отмене выбора компонентов!


Код:
Function .onSelChange

# Select SEC03 if SEC04 or SEC05 was selected.
SectionGetFlags ${SEC04} $3
SectionGetFlags ${SEC05} $4

${If} $3 == 1
${OrIf} $4 == 1
SectionSetFlags ${SEC03} 1
${ElseIf} $3 == 0
SectionSetFlags ${SEC03} 0
${ElseIf} $4 == 0
SectionSetFlags ${SEC03} 0
${EndIf}

и.т.д.
Автор: megane68
Дата сообщения: 14.11.2015 06:34
Всем здравия!
Был занят, поэтому долго не отписывался.
MKN
Ваш последний пример имеет прямую зависимость - при выборе/отмене SEC04 и SEC05, выбирается/отменяется SEC03.
Мне же скорее нужна обратная зависимость - при выборе SEC04 и SEC05, выбирается SEC03. При этом при отмене SEC04 и SEC05, секция SEC03 остаётся неизменной, а при отмене SEC03, отменяются SEC04 и SEC05.
Что- то у меня пока с этим туго.
Автор: MKN
Дата сообщения: 14.11.2015 10:25
megane68
Сделай вместо стандартной, собственную страницу выбора компонентов и не ломай голову.
Там уж просто выбрать любые зависимости и чекбоксов и чего угодно, а также добавить любые доп. элементы.
Автор: megane68
Дата сообщения: 17.11.2015 14:09
MKN
Наверное так и придётся делать, но не оставляю надежду.
Со своей страницей компоненотов тоже повозиться придётся.

У меня ещё такой вопрос:
На финишной странице надо запустить программу Update.exe, которая должна выполняться от имени администратора, но установщик прописан с провами пользователя специально.
В таком варианте запуск Uninstall.exe не осуществляется.
Можно ли как- то запустить экзешник от админа из под установшика в котором прописаны только права пользователя?
Автор: VictorVG2
Дата сообщения: 12.12.2015 05:28
NSIS v2.47 - v2.48 - исправление ошибок безопасности обнаруженных с момента выхода версии 2.46. Это официальное объяснение, No comment.

От меня - комплект из установочного ANSI пакета версии 2.48, обновления для неё (на другую версию не встанет), SDK и немного документации. В коде обновления кроме чистки мусора сделан основательный рефакторинг, посему и похудели прилично - куча строк улетела в /dev>nul.

Добавлено:
P.S.

Всё, усталость перевешивает необходимость. Работу отложим, сон - святое дело.)
Автор: ar13
Дата сообщения: 07.02.2016 22:39
Подскажите есть файл собранный nsis так там внутри только одна библиотека System.dll и этот файл портит файловую систему, хотел понять, это в самом nsis можно так сделать? без стороннего софта? или там был упакован ехе файл который не отображается?
Автор: VictorVG2
Дата сообщения: 07.02.2016 23:23
ar13

Можно, и я видел подобные "подарки" в реальности.
Автор: Sanch8
Дата сообщения: 08.02.2016 00:46
ar13
System.dll - это системный плагин NSIS который дает возможность вызвать любую экспортируемую функцию из любой dll. В принципе можно написать любой зло вред на основе этой dll.


Автор: ar13
Дата сообщения: 09.02.2016 20:23
А можно этот исполняемый файл дизассемблеровать?
Автор: VictorVG2
Дата сообщения: 09.02.2016 21:01
ar13

System.dll? А зачем коли его исходники и так доступны в nsis-2.50-src.tar.bz2 и nsis-3.0b3-src.tar.bz2?
Автор: ar13
Дата сообщения: 11.02.2016 19:14
Не сам System.dll! а то что выполняется после запуска!
Автор: VictorVG2
Дата сообщения: 11.02.2016 19:36
ar13

Та это уже не к NSIS. Там может что угодно работать...
Автор: imsorry
Дата сообщения: 02.03.2016 09:18
Я дико извиняюсь... сориентируйте, плз.

Сабж вижу первый раз в жизни. У него есть плагин Registry

Я правильно понимаю, что его ф-ция Registry Export, которя почему-то называется SaveKey, работает только с ключами (keys)?

Мне же нужен (в частности) экспорт выборочных параметров (values). Есть ли смысл дальше шариться по сабжу и его плагинах в поисках этого функционала?
.
Автор: MKN
Дата сообщения: 02.03.2016 10:55
imsorry

Цитата:
Мне же нужен (в частности) экспорт выборочных параметров (values).

Читай стандартными действиями, нужное значение из нужного ключа.
Из полученных данных делай стандартый рег файл (если надо).
Автор: imsorry
Дата сообщения: 02.03.2016 11:27
MKN
Понял. Все так же грустно, как и везде...
А разрабы на контакт идут? В виш заглядывают?
Так-то, по манам судя, вроде подошел бы мне этот NSIS...
Но этот экспорт вручную всю малину портит :(
.
Автор: MKN
Дата сообщения: 02.03.2016 11:35
imsorry

Цитата:
Но этот экспорт вручную

Почему вручную ? С помощью NSIS скрипта - читаешь, создаёшь и т.д.
Поконкретнее опиши задачу.
Автор: imsorry
Дата сообщения: 02.03.2016 11:47
MKN

Ну, к примеру, мне нужно экспортировать часть реестра (есть список вхождений).
Из них - сто ключей, а еще в одном ключе мне из десятка параметров нужно лишь два. Их я вынужден буду экспортировать вручную (дополнительным кодом) - писать ключ, писать параметр и его значение. Потом сливать файлы и терять при этом сортировку. Т.е. 100+0.2-сортировка.

Или экспортировать все кучей, а потом редактировать файл, вырезая из него ненужные параметры. Т.е. 101-0.8+сортировка. Но это еще более громоздко...
Автор: VictorVG2
Дата сообщения: 02.03.2016 13:53
imsorry

Проще можно - есть функции поиска и возможность фильтрации, но это да, мы сами пишем нужный код для нашей задачи ибо универсальных решений по определению не существует. А после получаем результат. Возможный способ - копируем нужное во временный ключ, его экспортируем, далее плагинами правим полученный текстовый файл убирая часть текста адресующего наш временный ключ. Ну а точнее по месту нужно смотреть, но задача решаемая.
Автор: imsorry
Дата сообщения: 02.03.2016 14:16
VictorVG2

Я дико извиняюсь... оно-то понятно, что задача решаемая...

Просто я в совершенном недоумении - почему данная ф-ция не востребована В ПРИНЦИПЕ! От слова вообще... Я перерыл все, что можно. Установил [more=более полусотни пакетов]Altap
Alyzer
ART
CheckNT
Cmndr
Convert
DatConv
DeHexer
Drill
Dump
Edit33
Explore
Ext
Finder
Grigory
Hex2Txt
HexSee
Istrar
KeyJmp
Link
Magik
MRRC
Offline
OO
OPen
Organ
OTConv
RegDiff
RegDOS
RegDrive
RegFix
Regg
RegHelp
RegJump
RegShot2
RegSupreme
RegTlkt
RegWorks
RegXX
Report
RGS
RReg
RS101
RXml
Seeker
Shl
Small
StartList
SysTracer
TrashReg
Vilma
Vwr
WiseCln
WShop
WWR
XSetupPro
Y_Cmd
Yeah
YSht[/more]

И единственное, что нашел - вот эту штучку.

И то - собственно экспорт в файл values не делает, хотя обращаться умеет...
.



Автор: VictorVG2
Дата сообщения: 02.03.2016 15:40
imsorry

На деле данная задача в NSIS возникает столь редко, что смысла в её специальном решении нет. Но можно её решить иначе - ReadRegValue -> WriteIni и удаление их него (если надо) лишних заголовков секций. Это идея "на вскидку", реально нужно повозится с писаниной кода, а на это у меня сейчас нет времени. Но общий подход вы видите.

А насчёт пакетов - может они вам были нужны?
Автор: Victor_VG
Дата сообщения: 03.04.2016 06:27
Комплект NSIS 2.51 + обновление (на Яндекс Диск лежит, так что если что починю ссылку). Только что для себя переписал часть кода - главное было обеспечить совместимость с v2.51 + обновить часть плагинов в т.ч. StdUtils до версии 1.0.9, nsisXML, UNICODE - этот явно был неудачно собран судя по битым импортам kernel32.dll, ну и возможность использовать строки до 8196 символов в коде получить, а заодно не портя код поставить русское меню для оболочки благо там HTML и его переводить одно удовольствие. Консольные бинарники трогать нечего - там и без нас найдётся кому дров наломать, а вот адрес-калькулятор который когда написал мой приятель не раз выручит, хотя и может сообщить об ошибке если адрес неправильно задать - пустые адреса в его алгоритм мы не закладывали. Он минимизируется в трей и коли был запущен то и висит там пока не получит от оператора команду на выход - так и было задумано.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

Предыдущая тема: The Bat!


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.