Показать полную графическую версию : [архив].: NSIS - все вопросы :.
bugmenotagain,
По моему, недоумение и разночтение вызывает не внятно поставленная тобой задача и не ясные конечные цели. Т.е. в целом - весь твой вопрос.
Вот ты пишешь :
Обязательно программу распаковывать в TEMP? Хочу как обычно, чтоб прямо из setup.exe устанавливать. Зачем ее куда то копировать. »
Не обязательно, и файлы устанавливаются-распаковываются (и запускаются "вложенные" в скрипт исполняемые файлы) , как правило непосредственно из setup.exe , но иногда, ИСХОДЯ ИЗ ПОСТАВЛЕННОЙ ЗАДАЧИ И СИТУАЦИИ, "вспомогательные" нужные для установки компоненты ( те же устанвщики MSI и т.д.), предварительно копируются во временную папку и уже оттуда запускаются-устанавливаются).
kotkovets
16-04-2012, 12:05
MKN, кнопки ты не заблокирушь так просто, событие обрабатывает nsis, поимимо твоего кода со скрипта, добавляется еще куча
сдужебных и необходимых команд.
конечно можно блокирнуть, перехватывать событие кнопки и ставить хук, но тока через внешнюю dll - много возни, поверь.
много возни, поверь. »
Конечно верю :) А как быть ?
kotkovets
16-04-2012, 12:47
А как быть ? »
Во время создания странички заблокировать кнопку командой EnableWindow,
перенести фокус на кастомную кнопку странички, при нажатии кнопки кастомной(после необходимых манипуляций),
разблокировать кнопку командой EnableWindow и через SendMessage передать событие нажатия кнопки,
${BM_CLICK} - как то так, что ли...
Во время создания странички заблокировать кнопку командой EnableWindow »
Я не особо вникал во "внутренности" граф. интерфейса NSIS, но где это прописывать? (если не учитывать факт создания кастомной странички)
Я смотрел макросы например MUI_WELCOM в System.nsh (на него ссылается MUI.nsh), но там по сути, нигде не отрабатывает команда EnableWindow на кнопку Далее
Даже если добавлять функцию как я написал ранее, перед самой страничкой с командой EnableWindow, она тоже не делает кнопку не активной :dont-know
Единственный способ как мне кажется, это проверять в функции (как опять же я выше написал) свои "потребности "и нажимать на кнопку "Назад", если что-то не так...
Если кто узнает другой способ, пишите :)
kotkovets
16-04-2012, 14:27
Даже если добавлять функцию как я написал ранее, перед самой страничкой с командой EnableWindow, она тоже не делает кнопку не активной »
пример на кастомной страничке:
!include MUI2.nsh
Page custom nsDialogsPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "Example.exe"
var dlg
var btn
var next
Function nsDialogsPage
nsDialogs::Create 1018
pop $dlg
GetDlgItem $next $HWNDPARENT 1
EnableWindow $next ${SW_HIDE}
${NSD_CreateButton} 100u 14u 50u 14u "Button"
pop $btn
${NSD_OnClick} $btn BtnClick
nsDialogs::Show
FunctionEnd
Function BtnClick
pop $btn
EnableWindow $next ${SW_SHOW}
SendMessage $next ${BM_CLICK} 0 0
FunctionEnd
Section
SectionEnd
nsis предоставляет к стандартным страничкам 3 функции
1. перед открытием странички
2. когда страничка открыта
3. когда страничка закрывается
пример на стандартной страничке:
!include MUI.nsh
!insertmacro MUI_PAGE_WELCOME
!define MUI_PAGE_CUSTOMFUNCTION_SHOW COMPONENTS_SHOW
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
outfile test.exe
OutFile "Example.exe"
var next
Function COMPONENTS_SHOW
GetDlgItem $next $HWNDPARENT 1
EnableWindow $next 0
FunctionEnd
Section /o test TEST_SEC
SectionEnd
Function .OnSelChange
SectionGetFlags ${TEST_SEC} $0
StrCmp $0 1 0 +2
EnableWindow $next ${SW_SHOW}
StrCmp $0 0 0 +2
EnableWindow $next ${SW_HIDE}
FunctionEnd
маленький вопросик, какой командой можно прекратить установку nsis? тоесть есть в скрипте проверка на существование ключа в реестре, если он есть установка продолжается, а вот если нет инсталяция должна прекратится...
XCV,
При не соответствии условию - Quit
wolkow70
18-04-2012, 12:26
kotkovets,
посоветуйте в таком вопросе:
!insertmacro MUI_PAGE_STARTMENU Application $MENU
Section "Создать группу ярлыков в меню Пуск" StartMenu
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
;
SetShellVarContext all
CreateDirectory "$SMPROGRAMS\$MENU"
CreateShortCut "$SMPROGRAMS\$MENU\${PRODUCT_NAME}.lnk" "$INSTDIR\USBSafelyRemove.exe"
CreateShortCut "$SMPROGRAMS\$MENU\Справка ${PRODUCT_NAME}.lnk" "$INSTDIR\USBSafelyRemoveRu.chm"
CreateShortCut "$SMPROGRAMS\$MENU\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\uninstall.exe"
;
!insertmacro CreateInternetShortcut \
"$SMPROGRAMS\$MENU\Веб-сайт ${PRODUCT_NAME}" \
"${PRODUCT_WEB_SITE}" \
"$INSTDIR\USBsrURL.ico" "0"
;
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd
Все нормально папка с ярлыками создается, где указано.
В деинсталляторе прописал:
Section Uninstall
;
SetShellVarContext all
RMDir /r "$SMPROGRAMS\$MENU"
при удалении на XP снесло почти все меню Пуск. пришлось восстанавливать систему. Что тут может быть не так?
kotkovets
18-04-2012, 14:02
wolkow70, Тысячу раз говорил:
значения переменных из секций инсталлятора не переносятся в секции деинсталлятора!!!
---
поэтому значение переменной $MENU в деинсталляторе может быть, какое угодно!
примеров стартменю великое множество!
wolkow70
18-04-2012, 14:22
значения переменных из секций инсталлятора не переносятся в секции деинсталлятора!!! »
Это я уже понял на горьком опыте. Тогда как прописать удаление то? Деинсталлятор же не знает в какую папку я поместил ярлыки. У меня они пишутся в Программы-Утилиты-USB Safely Remove (но у другого пользователя может отличаться...
Переменную я объявлял как в справке написано:
Var MENU #объявляем нашу переменную
Это я уже понял на горьком опыте. Тогда как прописать удаление то? »
Вроде бы всё правильно!
Попробуйте в секцию Uninstall добавить первой строкой
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $MENU
И смотрите, не могло просто так
снесло почти все меню Пуск »
может у вас в коде ранее что-то отрабатывает
wolkow70
18-04-2012, 15:55
может у вас в коде ранее что-то отрабатывает »
Нет, закоментировал :
;RMDir /r "$SMPROGRAMS\$MENU"
и перестало сносить.
Отдельно комманды прописываю, не удаляет.
Похоже не понимает переменную.
Delete "$SMPROGRAMS\$MENU\${PRODUCT_NAME}.lnk"
Попробую сделать как вы подсказали.
Константин_Кокухов@vk
18-04-2012, 16:07
Привет.
После прочтения вашего справочника по NSIS, сваялся маленький скриптик, с использованием RegistryFunc.nsh v2.0. Вот только незадача в том, что при попытке выдернуть из справочника саму библиотеку она выдергивается без форматирования. Мощности устройства head не хватает что бы красиво ее отформатировать и сделать так, что бы она нормально заработала. Сам файл библиотеки мне найти не удалось. Можете кинуть ссылочку откуда можно скачать эту библиотеку в нормально виде.
Спасибо.
wolkow70
18-04-2012, 16:08
Сделал так:
Section Uninstall
SectionIn 1 RO
;
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $MENU
SetShellVarContext all
RMDir /r "$SMPROGRAMS\$MENU"
Сносить меню перестало, но и удалять папку не удаляет.
закоментировал :
;RMDir /r "$SMPROGRAMS\$MENU" »
Значит переменная $MENU пустой выходит
Что мешает, тогда, сохранить её значение в реестр при установке??
Вы же создаёте деинсталлятор, запишите в ветку "Uninstall" своей программы значение этой переменной, и читайте значение параметра в эту переменную во время запуска деинсталлятора....
Можете кинуть ссылочку откуда можно скачать эту библиотеку в нормально виде. »
Все плагины можно скачать отсюда => http://nsis.sourceforge.net/Category:Plugins
kotkovets, внеси в шапку ссылку на плагины, либо я её не вижу, либо её там реально нет :)
Константин_Кокухов@vk
18-04-2012, 16:18
Цитата Константин_Кокухов@vk:
Можете кинуть ссылочку откуда можно скачать эту библиотеку в нормально виде. »
Все плагины можно скачать отсюда => http://nsis.sourceforge.net/Category:Plugins »
Спасибо, но я говорил про библиотеку которую написал kotkovets и которая не использует плагины.
wolkow70
18-04-2012, 16:20
Из содержания хедера StartMenu.nsh похоже, что значение переменной само в реестр прописывается и читаться должно макросом. Как его вызвать не пойму.
Спасибо, но я говорил про библиотеку которую написал kotkovets и которая не использует плагины. »
Я сейчас ее только для пробы Оперой скачал. Нужно сохранять, а не пытаться открыть.
Спасибо, но я говорил про библиотеку которую написал kotkovets и которая не использует плагины. »
Нормально всё сохраняется из справочника
Как его вызвать не пойму. »
Ну вы ей богу! :)
Берёте прописываете свою команду на запись в реестр и сохраняете значение этой переменной во время установки:
В секции установки:
WriteRegStr "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "MyCustom" "$MENU"
В первую строчку секции Uninstall пропишите чтение из этого параметра:
ReadRegStr $MENU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "MyCustom"
Попробуйте так...
Константин_Кокухов@vk
18-04-2012, 16:27
Попробуйте так... »
Большое спасибо.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC