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

» NSIS (Nullsoft Scriptable Install System)

Автор: mikutu
Дата сообщения: 15.02.2011 09:07
Сразу скажу что знание nsis у меня поверхностные.
Есть инсталятор основаный на MUI, возникла необходимость уменьшить количество нажатий при установке оставив все возможности инсталятора (т.е. сей час если пользователь ни чего не меняет то делает минимум 5 кликов мышью в инсталяторе, хотелось бы это количество сократить до 2 (принятие лицензии и завершении инсталяции (хотя возможно даже от этого можно отказаться так как на последней странице только опция запускать или нет установленную программу после выхода из инсталятора))). Сей час используются страницы
MUI_PAGE_WELCOME
MUI_PAGE_LICENSE
MUI_PAGE_COMPONENTS
MUI_PAGE_DIRECTORY
MUI_PAGE_INSTFILES
MUI_PAGE_FINISH
Первое что сделал отказался от страницы MUI_PAGE_WELCOME, следующим шагом вижу что нужно на странице MUI_PAGE_LICENSE добавить checkbox (нужен для того что бы пользователь мог выбрать режим установки по умолчанию или расширенный), т.е. если checkbox не отмечен то происходит переход на страницу MUI_PAGE_INSTFILES, а если отмечен то переходит на страницу MUI_PAGE_COMPONENTS (как в старом инсталяторе).
Пробовал сделать на примере вот этого
http://forums.winamp.com/showthread.php?threadid=264181
но у меня ни чего не получилось .
Автор: Victor_VG
Дата сообщения: 15.02.2011 10:28
mikutu

Код в студию, тогда можно будет глянуть что именно и как переделать. А так бесполезно. Общие советы только можно дать, а они на конкретном скрипте могут и не сработать.
Автор: mikutu
Дата сообщения: 15.02.2011 11:55
Вот примерный код (убрал лишнее оставил только необходимый минимум, необходимо для компиляции 2 файла в c:\ - test.exe и test.txt, а также плагины KillProcDLL, UAC, inetc)
http://narod.ru/disk/5671036001/setup_test.nsi.html
Автор: sawerx
Дата сообщения: 15.02.2011 21:42
mikutu

Я конечно не гуру, но из любопытства глянул скрипт.
Ту задачу, которую ты поставил, может быть легко решена по средствам nsDialogs.

1, Вроде бы простая задача, а скрипт раздут до уровня установки Врамеворка.
2, Если не нужны другие страницы, зачем их указывать?
3, Плагин KillProcDLL не зарезервирован, место назначения его не указано.
4, Такой путь желательно избегать - !insertmacro MUI_PAGE_LICENSE C:\test.txt
5, !define MUI_LANGDLL_REGISTRY_ROOT HKLM - если нет выбора языка зачем это
5, ReadRegStr $INSTDIR HKLM "${REGKEY}" Path - назначение этой строки мне не понятно.
6, File /r c:\test.txt ключ /r - это наверно шутка для первого апреля, найти все файлы с именем test.txt на диске C.



Добавлено:
У меня такой вопрос к специалистам, кто использовал плагин Games.dll?
Скрипт не может прочитать строку

Код: Games::registerGame "/mcicon:$INSTDIR\Snooker.png" "/mcrun:$INSTDIR\Snooker.lnk" "$INSTDIR\GsPoolSnooker.exe"
Автор: kot280379
Дата сообщения: 15.02.2011 22:26
mikutu
Делается элементарно. Есть пример скрипта - прыжки по страничкам:
http://nsis.sourceforge.net/Go_to_a_NSIS_page
Но почему то, со стандартной страничкой лицензии - функция не работает.
Пришлось подключить nsDialogs и нарисовать свою страничку лицензии, смотрим здесь:
http://nsis.sourceforge.net/LoadRTF
Подключаем хедер LoadRTF.nsh к основному скрипту.
Эта библиотека погружает файлы rtf, если текст лицензии - txt, копируем содержание txt файла в стандартный WordPad и сохраняем как файл rtf и к тому же текст лицензии можно раскрасить.
[more=Пример]
Код: !include "MUI2.nsh"
!include "LoadRTF.nsh"

Page custom LICENSESHOW LICENSELEAVE
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Name "LICENSE"
InstallDir "$PROGRAMFILES\LICENSE"
OutFile "Basic.exe"

;объявляем переменные
Var LicensePage
Var Dialog
Var CheckBox
Var Check
Var Label

Function LICENSESHOW
nsDialogs::Create 1018
Pop $Dialog
!insertmacro MUI_HEADER_TEXT_PAGE "Лицензионное соглашение" "Перед установкой $(^NameDA) ознакомьтесь с лицензионным соглашением."
nsDialogs::CreateControl "RichEdit20A" ${ES_READONLY}|${WS_VISIBLE}|${WS_CHILD}|${WS_TABSTOP}|${WS_VSCROLL}|\
${ES_MULTILINE}|${ES_WANTRETURN} ${WS_EX_STATICEDGE} 0u 17u 100% 72% "" ;создаем мультиконтрол для текста лицензии
Pop $LicensePage
${LoadRTF} "$EXEDIR\test.rtf" $LicensePage ;подгружаем файл лицензии.
${NSD_CreateLabel} 0 0u 100% 13u "Для перемещения по тексту используйте клавиши $\"PageUp$\" и $\"PageDown$\"." ;создаем надпись.
Pop $Label
${NSD_CreateCheckBox} 0 125u 50% 12u "Быстрая установка"
Pop $CheckBox
${NSD_OnClick} $CheckBox fnCheckBox ;обработка чебокса в реальном времени.
${NSD_UnCheck} $CheckBox ;по умолчанию чебокс не отмечен.
nsDialogs::Show
FunctionEnd

Function fnCheckBox ;функция обработки чебокса в реальном времени.
Pop $CheckBox
${NSD_GetState} $CheckBox $Check
${If} $Check = 0
GetDlgItem $0 $HWNDPARENT 1
${NSD_SetText} $0 `$(^NextBtn)`
${ElseIf} $Check = 1
GetDlgItem $0 $HWNDPARENT 1
${NSD_SetText} $0 `$(^InstallBtn)`
${EndIf}
FunctionEnd

Function LICENSELEAVE
${NSD_GetState} $CheckBox $Check ;считываем статус чебокса - отмечен чебокс - переход к стр. установки.
${If} $Check = 1
SendMessage $HWNDPARENT "0x408" "3" "" ;переход на 3 стр. вперед, т.е на стр. установки.
${EndIf}
FunctionEnd

Section "MAIN" MAIN
Sleep 500
SectionEnd

Section "MAIN 1" MAIN_1
Sleep 500
SectionEnd
Автор: mikutu
Дата сообщения: 16.02.2011 06:29
sawerx
Спасибо за замечания, убрал все о чем вы написали. /r Нужно в оригинальном скрипте (там просто берутся все файлы из определенной папки), а здесь я ее просто забыл убрать.

Цитата:
KillProcDLL не зарезервирован, место назначения его не указано

добавил резервирование для всех плагинов (кстати кстати из-за того что этого не было раньше иногда проскакивали небольшие баги), а вот про место назначения не понял он же ищет в оперативке процесс.

kot280379
Спасибо за скрипт, сделал все работает! Только появился небольшой баг на последней странице (MUI_PAGE_FINISH) при снятии галочки в checkbox инсталятор закрывается.
Автор: kot280379
Дата сообщения: 16.02.2011 08:59
mikutu
делайте через функцию, так все нормально работает:

Код: !define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION FUNCTIONFINISH


Function FUNCTIONFINISH

Exec "$INSTDIR\App.exe"

FunctionEnd
Автор: mikutu
Дата сообщения: 16.02.2011 11:45
kot280379
Я делал и так через функцию, баг был связан с тем что я вчера пытался вставить checkbox через ioSpecial.ini и потом (после того как у меня из этого ни чего не получилось) забыл убрать оттуда его описание.
Автор: kot280379
Дата сообщения: 16.02.2011 13:15
mikutu
Я использую только MUI2, и никаких конфигураций с ini файлами, все делается через API - функции
Автор: sawerx
Дата сообщения: 16.02.2011 19:24
Я дно не могу понять, а зачем тогда вообще использовать
!insertmacro MUI_PAGE_FINISH
она же использует картинку и лишнюю память!
не проще вставить это:

Код:
Function .onInstSuccess # финальное сообщение установки!
HideWindow # скрывает главное окно!
MessageBox MB_YESNO|MB_ICONQUESTION "Вы хотите запустить программу" IDNO +2
Exec "$INSTDIR\App.exe" # запуск файла после установки!
FunctionEnd
Автор: sawerx
Дата сообщения: 19.02.2011 12:03
У меня такой вопрос к специалистам, кто пробовал использовать InstallSpiderUI ?
или у кого есть языковые файлы для него!
Для простоты понимания перевёл страничку Readme.htm
Автор: kot280379
Дата сообщения: 19.02.2011 15:47
sawerx
Обычные правки хедеров MUI и ничего особого.. все на стандартных командах NSIS
И также правка ресурсов MUI ${NSISDIR}\Contrib\Uils\modern.exe и т.д
Что я сам практикую часто - переделываю под себя.. любым редактором ресурсов
А языки лежат ${NSISDIR}\NSIS\Contrib\Language files\*.nlf(nsh), коих править под себя - проще простого, любым текстовым редактором.
Можно также через SendMessage в проекте nsi, "подглядев" индетификаторы контролов любым редактором ресурсов.
Автор: sawerx
Дата сообщения: 20.02.2011 14:45
kot280379

Я только переделывал языки, но не трогал modern.exe
А ты не можешь это протестировать в отдельной папке.

Добавлено:
kot280379

Чем вы генерируете для nsDialogs - dialog units, - NSIS Form Designer умеет это делать?

Каждый из размеров, которые принимает макрос, это координаты, ширина и высота могут быть заданы в трех единицах измерения: - пиксели, единицы измерения диалога (dialog units) или проценты от пространства окна страницы. Они могут иметь и отрицательные значения, что указывает, что отсчёт величины будет в обратную сторону, то есть снизу или справа. Чтобы использовать единицы диалога (dialog units), измерение должно быть суффиксное с литерой u. Чтобы использовать процент, измерение должно быть суффиксное со знаком процента - %. Любой другой суффикс, или без суффикса, означает пикселы.

Единицы units диалога позволяют создавать диалоги, которые хорошо масштабируются, когда используются другие шрифты или DPI. Его размер в пикселах определён в среде выполнения, основан на шрифте и DPI. Например, стандартные страницы с классическим интерфейсом NSIS = 266 единиц в ширину диалога и 130 единиц в высоту диалога. Страницы в Modern UI = 300 единиц в ширину диалогов и 140 единиц в высоту диалога. В других разрешениях, используя другие шрифты или параметры настройки DPI, у диалогов всегда будет тот же самый размер в единицах диалога, но другой размер в пикселах.
Автор: kot280379
Дата сообщения: 20.02.2011 16:02

Цитата:
Чем вы генерируете для nsDialogs - dialog units, - NSIS Form Designer умеет это делать?

Руками , размеры контролов для простоты и точности - по своему опыту, лучше всего в dialog units, особенно полезны, так как отлично масштабируют размеры элементов управления под разные DPI и в процентах (для "массивных" контролов).
Для меня не составляет труда нарисовать любую страничку - добился только путем тренировки и немного опыта в этих делах. А сгенерить контролы для nsDialogs - с трудом представляю как это сделать, слишком специфично (используюся, то функции API для отрисовки), в отличии от ini файлов, где installoptions читает параметры ini и отрисовывает странички.

Цитата:
А ты не можешь это протестировать в отдельной папке

смысл че та не совсем ясен...
Автор: sawerx
Дата сообщения: 20.02.2011 22:16

Цитата:
смысл че та не совсем ясен...


Я несколько раз пробовал править языковые файлы, но всё равно выбивало ошибку на языках. ResourceHacker-ом не правил, так как точно не уверен, что именно править, и я думаю, что автор этого тоже не делал, иначе бы он его выложил бы.
Я просто подумал, что Гуру быстрее разберётся, тем более что в нём есть несколько интересных решений.

Я заметил, что в nsDialogs расстояние от края формы несколько меньше, чем для INI, по этому спросил.
В рукопашную, методом тыка не очень то удобно.
Автор: kot280379
Дата сообщения: 20.02.2011 23:36

Цитата:
Я заметил, что в nsDialogs расстояние от края формы несколько меньше, чем для INI, по этому спросил

Открывайте редактором ресурсов диалог 105 и правьте:
ID 1044 - применяется для старта и финиша (но ничто не мешает использовать на свои стр.)
ID 1018 - стандарт де-факто

Цитата:
В рукопашную, методом тыка не очень то удобно.

На данный момент альтернативы

Автор: SvetonosnyAngel
Дата сообщения: 05.03.2011 12:19

Цитата:
Кто подскажет как сделать чтобы установка NSIS подхватывала файл из той же папки где она сама?


Тоже интересует такой вопрос. И что бы еще этот файл копировался в профиль программы.
Подскажите.
Автор: kot280379
Дата сообщения: 05.03.2011 12:36

Цитата:
этот файл копировался в профиль программы

CopyFiles /silent "$EXEDIR\file" "Мой_аддцкий_путь\file"
Файл копируется из папки установки (запуска инсталлятора) в указанный путь, причем указанный путь должен быть реальным (существовать) иначе не скопируется...

ИЛИ

Цитата:
Кто подскажет как сделать чтобы установка NSIS подхватывала файл из той же папки где она сама?

File "/oname=Мой_аддцкий_путь\файл" "Абсолютный_путь\file"
И вообще в справке почитайте по индексу File

Автор: SvetonosnyAngel
Дата сообщения: 05.03.2011 12:50
kot280379


Цитата:
CopyFiles /s "$EXEDIR\file.ini" "Мой_аддцкий_путь\file.ini"
Файл копируется из папки установки (запуска инсталлятора) в указанный путь, причем указанный путь должен быть реальным (существовать) иначе не скопируется...


Я сделал перепаковку Winamp и такую секцию:

Section "Применение настроек" sec02
SetShellVarContext current
CreateDirectory "$APPDATA\Winamp"
SetOutPath "$APPDATA\Winamp"
CopyFiles /s "$EXEDIR\Winamp.ini" "$APPDATA\Winamp\Winamp.ini"
SectionEnd

Компиллятор пишет ошибку в строке
CopyFiles /s "$EXEDIR\Winamp.ini" "$APPDATA\Winamp\Winamp.ini"

Section: "Применение настроек" ->(sec02)
SetShellVarContext: current
CreateDirectory: "$APPDATA\Winamp"
SetOutPath: "$APPDATA\Winamp"
Usage: CopyFiles [/SILENT] [/FILESONLY] source_path destination_path [total_size_in_kb]
Error in script "D:\NSIS\Winamp.nsi" on line 61 -- aborting creation process
Автор: kot280379
Дата сообщения: 05.03.2011 13:29
copyfiles /silent
Автор: SvetonosnyAngel
Дата сообщения: 05.03.2011 13:58
kot280379

Цитата:
copyfiles /silent

Сработало!!! Спасибо.


Добавлено:
Может кто нибудь подскажет как в процессе установки зарегить прогу, если рег-файл с данными будет находится в одной директории с установщиком?
Автор: kot280379
Дата сообщения: 05.03.2011 17:20
SvetonosnyAngel

Цитата:
Может кто нибудь подскажет как в процессе установки зарегить прогу, если рег-файл с данными будет находится в одной директории с установщиком?


Код: IfFileExists "$EXEDIR\data.reg" 0 +2
Execwait 'regedit /s "$EXEDIR\data.reg"'
Автор: rte7
Дата сообщения: 10.03.2011 15:27
как устранить это появление в tightvnc
у клиента при загрузке выбивает один раз это окно потом через пару сек пропадает



как устранить это сообщение устанавливал через ключ /sp- /verysilent
источник http://www.tightvnc.com/winst.php
Автор: kot280379
Дата сообщения: 10.03.2011 17:40
rte7
А при чем тут NSIS ???

Цитата:
/sp- /verysilent

Визитная карточка Inno Setup
Автор: rte7
Дата сообщения: 10.03.2011 19:32
а сорри тогда...не туда запостил.
Автор: qwerqwer444
Дата сообщения: 16.03.2011 09:39
каким образом подменяются файлы в готовом инсталле? ведь теоретически это не возможно как это делают или надо быть супер профи?
Автор: John_White
Дата сообщения: 17.03.2011 10:29
qwerqwer444

Цитата:
каким образом подменяются файлы в готовом инсталле? ведь теоретически это не возможно как это делают или надо быть супер профи?

От архитектуры инсталлятора зависит.
Как пример, если программа извлекает файлы из внешнего архива и нет проверки контрольных сумм, то можно и подменить.
А лучше написать свое что-то.
На правах оффтопа.
Не видел ни одного грамотно реализованного официального инсталлятора для пк игр.
Автор: qwerqwer444
Дата сообщения: 17.03.2011 11:37
понятно что написать своё лучше не в том вопрос, мне вот именно теоретически интересно как это делается. уже в готовом установщике nsis заменить какой либо файл на другой сохранив при этом и размер установщика и даже цифровую подпись!!! при этом конечно же хеш установщиков оригинала и переделанного будет разный но размер в мегабайтах одинаковый останется. пример есть перед глазами официальный дистрибутив одной проги и переделанный одной из релиз групп. сижу смотрю своим глазам не верю но факт есть факт. инстал целиковый то есть одним файлом. проще говоря крекеры как то заменили оригинальный экзешник проги на крякнутый прямо в установщике и цифровая подпись даже осталась, но как это они смогли если это не возможно то??? мистика какая то
Автор: kot280379
Дата сообщения: 17.03.2011 14:33
qwerqwer444
В инсталляторах есть проверка на целостность архива, СRCheck, который не дает изменять инсталлятор или говорит, что поврежден. Что приходит в голову:
1. Под отладчиком (олькой или Irda) до момента вызова поцедуры проверки целостности архива - ставят хук и изменяют один байт - это еще можно такой трюк сделать (лично я не знаю как)
2. Подменют файл, с таким же именем и т.д и сохраняют инсталлятор.
По 2 пункту, думаю врядли получится - скрипт не хранится в инсталле, он преобразуется в машинный код.
и в любом случае получим ошибку при замене файла. Хотя с другой стороны посмотреть, вроде бы один и тот же файл, с одним именем - проверка целостности то отключена!
Но склоняюсь к мнению, что инсталлятор очень грамотно переупаковали все таки!
Изучили инсталляцию, все тонкости, ресурсы взять можно и с оригинала (картинки, иконки, размера контролов и т.д). крякнуть нужный файлик переписать сценарий аналогично оригинальному и запаковать. Этот способ нудный, но ВПОЛНЕ РЕАЛЬНО РЕАЛИЗОВАТЬ!

Автор: qwerqwer444
Дата сообщения: 17.03.2011 15:24
kot280379
спасибо за ответ примерно понятно теперь хоть стало так и думал что отладчиком пользовались или чем то подобным, а если перепаковали они сами то как подписали инсталлятор цифровой подписью компании? подделали значит. короче я конечно знаю что это группа сверх профи и походу им это всё пять секунд работы. просто заинтриговало то что это именно nsis они так надурили ведь если бы был msi какой нибудь или инсталшилд там то это ещё понятно было бы а тут...да ребята конечно профи.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

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


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