PDA

Показать полную графическую версию : [архив].: NSIS - все вопросы :.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 [71] 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

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

И опять при деинсталляции вылазит окно с чебоксами перезагрузки.

K.A.V.
28-07-2011, 17:09
!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 ?
Впрочем, я пробовал запустить и с раскомментированной строкой. В обоих случаях финиш-страница предлагала перезагрузку.. Почему-то.. А если отказаться от "Показать, тогда без чебоксов.

K.A.V.
28-07-2011, 17:47
Почему у Вас закоментирована StrCpy $RestartExplorerSectionChecked 1 ? »
Потому что я дал вам пример с вопросом "Да/Нет", эта строка просто не нужна для тестов
Там при деинсталляции задаётся вопрос "Показать?", если ответите "Да" - вам покажется страничка с выбором для перезагрузки, если нажмёте "Нет" - то не покажется

Хотите сказать не работает? :o
Почему тогда вот я сейчас сижу проверяю (и не раз проверял перед тем, как выложить этот пример сюда) и каждый раз у меня срабатывает, в зависимости от ответа?
Или вам выложить готовый EXE файл?

Значит у вас либо что-то в скрипте прописано, либо я не знаю...Выложите ваш скрипт полностью сюда, посмотрим

wolkow70
28-07-2011, 17:58
Выложите ваш скрипт полностью сюда, посмотрим »

Скопируете скрипт, дайте знать, его сразу уберу. Он пока не для широкой публики.

K.A.V.
28-07-2011, 18:16
Странно...
Т.к. в вашем скрипте много нестандартного, откомпилировать у себя я не могу, поэтому попробуйте заменить строки


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, проще, проще... »
все равно окно вылазит с чебоками. Даже , если подсекцию поднять выше секции..

K.A.V.
29-07-2011, 10:52
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?

K.A.V.
29-07-2011, 11:27
Это предложение касается вашего вчерашнего способа? »
Да

Если, да то дважды объявляется
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