Показать полную графическую версию : [архив].: NSIS - все вопросы :.
kotkovets
25-07-2011, 14:16
wolkow70, потому что нужно читать внимательно описание либы:
Для полноценной работы модуля требуется плагин Registry:
http://nsis.sourceforge.net/Registry_plug-in
kotkovets
26-07-2011, 23:18
Добрались руки....
---
Исправил ошибки в библиотеке DelRegKey.nsh
1. В макросе ${DelRegValue} исправил ошибку открытия корневого раздела HKCR и проблему удаления параметров ключей.
2. Оптимизировал поиск значений параметров ключей в ${DelRegValue} - поиск ведется только на строковые параметры: REG_SZ и REG_EXPAND_SZ. Это несколько ускоряет поиск значений параметров
3. Оптимизировал применение библиотеки в пользовательских макросах - был конфликт использования переменных
*****
В окне деталей показываютя удаленные ключи, если в окне деталей ничего нет - значит идет поиск!
Указывайте ветку реестра, насколько возможно точнее, это нужно
для сокращения времени поиска, которое может длиться весьма продолжительное время!
Подробнее (http://forum.oszone.net/showpost.php?p=1658900)
P.S
В общем это последнее изменение в библиотеке, так как для справочника готовлю библиотеку RegistryFunc.nsh - который полностью перекрывает возможности DelRegKey.nsh и избавлен от применения плагина Registry (http://nsis.sourceforge.net/Registry_plug-in) - фактически тот же функционал будет.
Если нужны новые возможности для работы с реестром, которых нет у плагина - пишите на форум, обсудим!
Мужики такой вопрос!!! nsis инсталятор может делать callback установки, что программа которая запускает установщик могла знать скока процентов установки завершенно ????
wolkow70
28-07-2011, 10:06
kotkovets,
${WinVerGetMajor} $R0 ;определяем старшую цифру Windows
IntCmp $R0 5 +4 +4 0
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
;
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell" "" "Open"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Open" "" "Воспроизвести"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\Open\command" "" "$OpenCommand"
; »
Мне непонятна интерпретация строки IntCmp $R0 5 +4 +4 0
Почему то наоборот на XP прописывается:
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
и не прописывается:
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" "$ClassName"
Мне непонятна интерпретация строки IntCmp $R0 5 +4 +4 0 »
IntCmp $0 5 ЕСЛИ_РАВНО ЕСЛИ_МЕНЬШЕ ЕСЛИ_БОЛЬШЕ
ЕСЛИ_РАВНО:
DetailPrint "$$0 == 5"
Goto done
ЕСЛИ_МЕНЬШЕ:
DetailPrint "$$0 < 5"
Goto done
ЕСЛИ_БОЛЬШЕ:
DetailPrint "$$0 > 5"
done:
wolkow70
28-07-2011, 10:46
Товарищи, подмогните еще в одном вопросе:
Сделал секцию
Section /o "Un.Перезагрузка Проводника Windows" RestartExplorer
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
В секции Uninstall
RMDir /r /REBOOTOK "$INSTDIR\"
SetAutoClose true
SectionEnd
То есть выходит так, что, даже если выбрана секция RestartExplorer, и залоченный файл удаляется, то финиш-окно выводится с предложением произвести перезагрузку. Как бы сделать, что если выбрана секция RestartExplorer, то в секции Uninstall срабатывала комманда просто RMDir /r "$INSTDIR\", а если не выбрана, то RMDir /r /REBOOTOK "$INSTDIR\"
Section /o "Un.Перезагрузка Проводника Windows" RestartExplorer
Var /Global RestartExplorerSectionChecked
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
В секции Uninstall
StrCmp $RestartExplorerSectionChecked "1" 0 +3
RMDir /r "$INSTDIR"
goto +2
RMDir /r /REBOOTOK "$INSTDIR"
SetAutoClose true
SectionEnd
wolkow70
28-07-2011, 11:57
K.A.V.,
Сделал по Вашему совету:
StrCmp $RestartExplorerSectionChecked "1" 0 +3
RMDir /r "$INSTDIR"
goto +2
RMDir /r /REBOOTOK "$INSTDIR"
SetAutoClose true
SectionEnd
;
Section /o "Un.Перезагрузка Проводника Windows" RestartExplorer
Var /Global RestartExplorerSectionChecked
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
Все равно выводится окно с REBOOTOK. Видимо потому, что секция Uninstall отрабатывает раньше, чем RestartExplorer
Все равно выводится окно с REBOOTOK »
Так вам нужно окно убрать (FINISHPAGE?) в конце удаления с чекбоксом или что?
Вы написали:
если выбрана секция RestartExplorer, то в секции Uninstall срабатывала комманда просто RMDir /r "$INSTDIR\", а если не выбрана, то RMDir /r /REBOOTOK "$INSTDIR\" »
Для этого вопроса код правильный
Видимо потому, что секция Uninstall отрабатывает раньше, чем RestartExplorer »
Не отрабатывает она раньше
wolkow70
28-07-2011, 12:29
Для этого вопроса код правильный »
Да выполнение правильно
Так вам нужно окно убрать (FINISHPAGE?) в конце удаления с чекбоксом или что? »
Да, в случае выбора секции RestartExplorer, что бы FINISHPAGE в конце удаления была без чекбоксов (перезагрузить сейчас или позже), поскольку в перезагрузке уже нет смысла, так как файл разлочен и папка удалена.
А в случае, если секция RestartExplorer не выбрана, удаление идет обычным образом через предложение перезагрузки с применением значения /REBOOTOK.
kotkovets
28-07-2011, 13:20
wolkow70, Если выполнилась команда /REBOOTOK, то устанавливается флаг перезагрузки, на этом можно построить логику на финишной странице, в зависимости от флага - чебокс на финише будет отмечен или не отмечен, либо скрывать контрол (чебокс) на финишной страничке, т.е логику выполнять когда финишная страница открыта.
В справочнике > стандартные функции - почитать.
и команду IfRebootFlag ничего сверхсложного
wolkow70
28-07-2011, 13:41
wolkow70, Если выполнилась команда /REBOOTOK, то устанавливается флаг перезагрузки, на этом можно построить логику на финишной странице, в зависимости от флага - чебокс на финише будет отмечен или не отмечен, либо скрывать контрол (чебокс) на финишной страничке, т.е логику выполнять когда финишная страница открыта.
В справочнике > стандартные функции - почитать.
и команду IfRebootFlag ничего сверхсложного »
Дак ведь, при такой конструкции команда /REBOOTOK не должна быть выполнена, при отмеченной секции RestartExplorer, и соответтсвенно флагов перезагрузки не должно быть. Вот, что мне не понятно.. А реально, они появляются.
Section Uninstall Uninstall
SectionIn 1 RO
---бла-бла----
StrCmp $RestartExplorerSectionChecked "1" 0 +3
RMDir /r "$INSTDIR"
goto +2
RMDir /r /REBOOTOK "$INSTDIR"
SetAutoClose true
SectionEnd
;
Section /o "Un.Перезагрузка Проводника Windows" RestartExplorer
Var /Global RestartExplorerSectionChecked
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
kotkovets
28-07-2011, 13:58
А реально, они появляются »
А вот как вы определяете флаг перезагрузки?
Да, в случае выбора секции RestartExplorer, что бы FINISHPAGE в конце удаления была без чекбоксов »
Так, собственно...
В секцию Uninstall добавить проверку переменной...
StrCmp $RestartExplorerSectionChecked "1" 0 reboot
RMDir /r "$INSTDIR"
SetRebootFlag false
goto done
reboot:
RMDir /r /REBOOTOK "$INSTDIR"
SetRebootFlag true
done:
wolkow70
28-07-2011, 14:37
Так, собственно...
В секцию Uninstall добавить проверку переменной... »
Не помогло.
Окно выводится:
http://i019.radikal.ru/1107/58/4a74168836a1.png
Хотя в этот момент уже фактически нет ни папки ни залоченного файла в системе.
В компиляторе показывается:
unknown variable/constant "{Uninstall}" detected, ignoring (D:\NSIS\xnview.nsi:1109)
unknown variable/constant "RestartExplorerSectionChecked" detected, ignoring (D:\NSIS\xnview.nsi:1523)
А вот как вы определяете флаг перезагрузки? »
А если просто удалять коммандой RMDir /r "$INSTDIR", то чебоксов перезагрузки нет. Просто залоченный файл удаляется после перезагрузки вместе с папкой в ручную.
http://s55.radikal.ru/i149/1107/83/d528c92dbfbf.png
kotkovets
28-07-2011, 14:53
А если просто удалять коммандой RMDir /r "$INSTDIR", то чебоксов перезагрузки нет. Просто залоченный файл удаляется после перезагрузки вместе с папкой. »
я то ведь не с проста задал вопрос, почему отладку не делаете? выявите флаг перезагрузки, через IfRebootFlag , без финишной странички - вы узнаете кто еще ставит флаг, да и дифайны (константы финишной странички посмотрите в своем скрипте). А гадать так не пошло, то не это, да не то - себе же мозг выносить.
wolkow70
28-07-2011, 15:45
; Uninstaller pages
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
;!insertmacro MUI_UNPAGE_FINISH -закомментировал
Прописал в Uninstall:
IfRebootFlag 0 NotReboot
MessageBox MB_ICONQUESTION|MB_YESNO "Перезагрузить компьютер ?" IDNO +2
#Reboot #команда перезагрузки
NotReboot:
MessageBox MB_OK "Перезагрузка отменена!"
Вывело запрос на перезагрузку.
Закомментировал:
;RMDir /r /REBOOTOK "$INSTDIR"
;SetRebootFlag true
Вывело перезагрузка отменена.
То есть это единственный флаг на перезагрузку.
Задается, если StrCmp $RestartExplorerSectionChecked "1" 0 reboot
Значит не прописывается значение:
Var /Global RestartExplorerSectionChecked
StrCpy $RestartExplorerSectionChecked 1
Может в Function un.onInit прописать чего?
kotkovets
28-07-2011, 15:56
Может в Function un.onInit прописать чего? »
Var /Global RestartExplorerSectionChecked
wolkow70
28-07-2011, 16:30
Цитата wolkow70:
Может в Function un.onInit прописать чего? »
Var /Global RestartExplorerSectionChecked »
Не помогло. Может в функции /Global не нужно?
Такое еще ощущение, что в этом дело: StrCpy $RestartExplorerSectionChecked 1
Может 1 нужно в кавычки заключить?
unknown variable/constant "RestartExplorerSectionChecked" detected, ignoring (D:\NSIS\xnview.nsi:1523) »
Пропишите создание переменной в самое начало скрипта
Var RestartExplorerSectionChecked
и расскоменитруйте
!insertmacro MUI_UNPAGE_FINISH
и используйте мой пример, он рабочий, только что у себя проверял!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC