Показать полную графическую версию : [архив].: NSIS - все вопросы :.
wolkow70
28-07-2011, 16:52
Прописал создание переменной в самое начало скрипта
Var RestartExplorerSectionChecked
Section Uninstall Uninstall
SectionIn 1 RO
!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED "$INSTDIR\ShellEx\XnViewShellExt.dll"
--бла---
Call un.RefreshShellIcons
;
StrCmp $RestartExplorerSectionChecked "1" 0 reboot
RMDir /r "$INSTDIR"
SetRebootFlag false
goto done
reboot:
RMDir /r /REBOOTOK "$INSTDIR"
SetRebootFlag true
done:
SetAutoClose true
SectionEnd
;
Section /o "Un.Перезагрузка Проводника Windows" RestartExplorer
StrCpy $RestartExplorerSectionChecked 1
SectionIn 1
ExecWait 'taskkill /F /IM explorer.exe' $0
DetailPrint "taskkill exit: [ $0 ]"
Sleep 500
StrCmp $0 0 0 +2
Exec "explorer.exe"
Delete "$INSTDIR\ShellEx\XnViewShellExt.dll"
RMDir /r "$INSTDIR\ShellEx\"
RMDir /r "$INSTDIR\"
SectionEnd
И опять при деинсталляции вылазит окно с чебоксами перезагрузки.
!insertmacro MUI_UNPAGE_FINISH
Раскомментировали?
Вот смотрите, стандартный код, который создаёт HM NIS Edit, работающий с моим описание
; Script generated by the HM NIS Edit Script Wizard.
; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "Моя программа"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "Моя компания, LLC."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
; MUI 1.67 compatible ------
Var RestartExplorerSectionChecked
!include "MUI.nsh"
!define MUI_FINISHPAGE_REBOOTLATER_DEFAULT
; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
!define MUI_FINISHPAGE_RUN "$INSTDIR\WinXP_Reg.exe"
!define MUI_FINISHPAGE_RUN_TEXT "Запустить '${PRODUCT_NAME} ${PRODUCT_VERSION}'"
!define MUI_FINISHPAGE_RUN_NOTCHECKED
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Components page
!insertmacro MUI_PAGE_COMPONENTS
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
; Language files
!insertmacro MUI_LANGUAGE "Russian"
; MUI end ------
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "setup.exe"
InstallDir "$PROGRAMFILES\Моя программа"
ShowInstDetails show
ShowUnInstDetails show
Section "MainSection" SEC01
createdirectory $INSTDIR
SectionEnd
Section -Post
WriteUninstaller "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd
; Section descriptions
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SEC01} ""
!insertmacro MUI_FUNCTION_DESCRIPTION_END
Function un.onUninstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "Удаление программы $(^Name) было успешно завершено."
FunctionEnd
Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы уверены в том, что желаете удалить $(^Name) и все компоненты программы?" IDYES +2
Abort
FunctionEnd
Section "un.TEST"
#StrCpy $RestartExplorerSectionChecked 1
SectionEnd
Section Uninstall
MessageBox MB_YESNO|MB_ICONQUESTION "Показать?" idno +3
StrCpy $RestartExplorerSectionChecked 0
goto +2
StrCpy $RestartExplorerSectionChecked 1
StrCmp $RestartExplorerSectionChecked "1" 0 reboot
RMDir /r "$INSTDIR"
SetRebootFlag false
goto done
reboot:
RMDir /r /REBOOTOK "$INSTDIR"
SetRebootFlag true
done:
SetAutoClose true
Delete "$INSTDIR\uninst.exe"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
SectionEnd
wolkow70
28-07-2011, 17:40
Section "un.TEST"
#StrCpy $RestartExplorerSectionChecked 1
SectionEnd
Почему у Вас закоментирована StrCpy $RestartExplorerSectionChecked 1 ?
Впрочем, я пробовал запустить и с раскомментированной строкой. В обоих случаях финиш-страница предлагала перезагрузку.. Почему-то.. А если отказаться от "Показать, тогда без чебоксов.
Почему у Вас закоментирована StrCpy $RestartExplorerSectionChecked 1 ? »
Потому что я дал вам пример с вопросом "Да/Нет", эта строка просто не нужна для тестов
Там при деинсталляции задаётся вопрос "Показать?", если ответите "Да" - вам покажется страничка с выбором для перезагрузки, если нажмёте "Нет" - то не покажется
Хотите сказать не работает? :o
Почему тогда вот я сейчас сижу проверяю (и не раз проверял перед тем, как выложить этот пример сюда) и каждый раз у меня срабатывает, в зависимости от ответа?
Или вам выложить готовый EXE файл?
Значит у вас либо что-то в скрипте прописано, либо я не знаю...Выложите ваш скрипт полностью сюда, посмотрим
wolkow70
28-07-2011, 17:58
Выложите ваш скрипт полностью сюда, посмотрим »
Скопируете скрипт, дайте знать, его сразу уберу. Он пока не для широкой публики.
Странно...
Т.к. в вашем скрипте много нестандартного, откомпилировать у себя я не могу, поэтому попробуйте заменить строки
StrCmp $RestartExplorerSectionChecked "1" 0 reboot
на
MessageBox MB_OK|MB_ICONINFORMATION "$$RestartExplorerSectionChecked = $RestartExplorerSectionChecked"
StrCmp $RestartExplorerSectionChecked "1" 0 reboot
В процессе удаления появится сообщение, может быть по какой-то причине переменной не назначается значение? Я даже не знаю...Если в сообщении будет пусто, значит попробуем прочитать флаг секции прямо там)
wolkow70
28-07-2011, 19:00
В процессе удаления появится сообщение, может быть по какой-то причине переменной не назначается значение? »
Ну, конечно не назначается...
http://s011.radikal.ru/i316/1107/a5/568134eb59fc.png
Выяснил причину.
В Вашем примере назначение значения производилось из секции деинсталляции и в этой же секции читалось.
А у меня назначение значения идет из подсекции, а чтение в секции. В данном случае нарушается последовательность действий.
Попробовал в скрипте поднять подсекцию над секцией и сообщение показало значение "1". Все отработало.
Только выглядит это теперь в окне деинсталлятора неправильно (сначала подсекция, потом основная секция).
kotkovets
28-07-2011, 19:21
wolkow70, проще, проще....
Section /o "Un.Перезагрузка Проводника Windows" RestartExplorer
SectionIn 1
SetRebootFlag true
ExecWait 'taskkill /F /IM explorer.exe' $0
Sleep 500
StrCmp $0 0 0 +2
Exec "explorer.exe"
Delete "$INSTDIR\ShellEx\XnViewShellExt.dll"
RMDir /r "$INSTDIR\ShellEx\"
RMDir /r "$INSTDIR\"
SectionEnd
Section Uninstall Uninstall
SectionIn 1 RO
;
!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED "$INSTDIR\ShellEx\XnViewShellExt.dll"
;
SetShellVarContext all
IfRebootFlag +2
RMDir /r "$INSTDIR"
IfRebootFlag 0 +2
RMDir /r /REBOOTOK "$INSTDIR"
SectionEnd
;
И не нужно объявлять пользовательскую переменную (которую обязательно сначало нужно иницилизировать в первой функции деинсталла), просто рулим флагами перезагрузки.
kotkovets
28-07-2011, 23:09
и все таки нашел грубую очепятку, да простите уж меня :) ...хвост после отладки скрипта остался,
и куча значений в стеке, довольно слабое место NSIS.
Кто пользуется DelRegKey.nsh огромная просьба заменить, во избежание неприятных последствий..
http://forum.oszone.net/showpost.php?p=1658900
wolkow70
29-07-2011, 10:14
wolkow70, проще, проще... »
все равно окно вылазит с чебоками. Даже , если подсекцию поднять выше секции..
wolkow70, сделайте так
Section "Un.Перезагрузка Проводника Windows" RestartExplorer
...
SectionEnd
Section "-un.HiddenSection"
SectionGetFlags ${RestartExplorer} $0
StrCmp $0 "1" 0 +2
StrCpy $RestartExplorerSectionChecked 1
SectionEnd
Section Uninstall
...
SectionEnd
Сохраняя порядок секций, это конечно минус в этом способе..
wolkow70
29-07-2011, 11:13
Сохраняя порядок секций, это конечно минус в этом способе.. »
Это предложение касается вашего вчерашнего способа? Если, да то дважды объявляется
StrCpy $RestartExplorerSectionChecked 1
Ксати Ваш то вариант работает, если подсекцию поднять над секцией.
Но не хочется этого делать.
Или это предложение к последнему предложению kotkovets?
Это предложение касается вашего вчерашнего способа? »
Да
Если, да то дважды объявляется
StrCpy $RestartExplorerSectionChecked 1 »
Оставьте только в скрытой секции -un.HiddenSection, из секции RestartExplorer удалите
kotkovets
29-07-2011, 11:29
wolkow70, смысл в том, что предложение о перезагрузке будет появляться только, когда флаг перезагрузки будет включен SetRebootFlag true, если выключен флаг, то SetRebootFlag false, то не будет предлагать перезагрузку.
Delete /REBOOTOK файл - включает флаг перезагрузки true. Эти флаги проверяются на финишной страничке. Поэтому здесь имеет смысл добавить функцию, которая будет выполняться после всех секций, но перед финишной страницой или во время выполнения финишной странички. В этой функции можно рулить командами удаления и флагами перезагрузки, состоянием отмеченных секций - таким образом можно не смещать расположение секций и в зависимости от состояния отмеченных секций - выполнять необходимые действия.
wolkow70
29-07-2011, 12:07
K.A.V.,
Работает, но только в такой последовательности секций.
если подсекцию RestartExplorer вернуть на место, то независимо от выбора финиш Page выводится без чебоксов, при значении RestartExplorerSectionChecked 1
Поэтому здесь имеет смысл добавить функцию, которая будет выполняться после всех секций, но перед финишной страницой или во время выполнения финишной странички. »
А разве это возможно? Финишная страница же выполняется в основной секции удаления.. (если я правильно понимаю)...
kotkovets
29-07-2011, 12:38
А разве это возможно? »
конечно! в моей вариации генератора ответов именно так и сделано! там куча функций которые выполняются перед различными страничками, к примеру
!define MUI_PAGE_CUSTOMFUNCTION_SHOW SHOWFINISH - функция SHOWFINISH которая выполняется при показе финишной странички, в генераторе помещает надпись "Файл ответов готов"
MUI_PAGE_CUSTOMFUNCTION_PRE function - перед любой указанной страничкой
MUI_PAGE_CUSTOMFUNCTION_SHOW function - во время показа странички
Читайте доки про модерн ..\Docs\Modern UI 2
вот такой способ....
!include "MUI2.nsh"
Name "Modern UI Test"
OutFile "UnFinish.exe"
InstallDir "C:\Modern UI Test"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
UninstPage custom un.FINISH
!insertmacro MUI_UNPAGE_FINISH
!insertmacro MUI_LANGUAGE "English"
Section "Dummy Section" SecDummy
SetOutPath "$INSTDIR"
WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd
Section "Uninstall"
MessageBox MB_OK "Секция Uninstall" IDOK
SectionEnd
Function un.FINISH
MessageBox MB_OK "Это сообщение появится перед страничкой MUI_UNPAGE_FINISH" IDOK
FunctionEnd
В функции un.FINISH проверяйте отмеченными секции или командами удаления или рулите флагами перезагрузки
wolkow70
29-07-2011, 13:03
Скорее всего нужно использовать Function un.onInit, которая перед запуском деинсталляции считывала бы флаги с секций и помещала их в переменные. Ав секциях уже производилась интерпретация.
Как этог сделать сам не знаю...
kotkovets
29-07-2011, 13:56
Скорее всего нужно использовать Function un.onInit »
Вам ничем не поможет, это самая первая функция
kotkovets
29-07-2011, 14:14
wolkow70, Вот вы объясните на пальцах при каких условиях вам нужно на финише, предложение о перезагрузке?
wolkow70
29-07-2011, 14:40
Предложение о перезагрузке появляется в том случае, если программа удаляется стандартным способом, когда выгрузка из памяти и удаление залоченного файла производится при перезагрузке системы. Таких программ много, поэтому вопрос актуальный.
В тоже время, существует альтернативный способ, когда после деинсталляции собственно программы перезагружается проводник и удаляется залоченный файл без перезагрузки системы. Разумеется, в таком случае предложение о перезагрузке на финишной странице излишне. Сам то я об этом знаю, поэтому просто пропускаю перезагрузку. Но другие пользователи сборки могут не понимать механизма и делать ненужную уже перезагрузку.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC