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

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) - фактически тот же функционал будет.
Если нужны новые возможности для работы с реестром, которых нет у плагина - пишите на форум, обсудим!

SOLON7
28-07-2011, 04:05
Мужики такой вопрос!!! 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"

K.A.V.
28-07-2011, 10:26
Мне непонятна интерпретация строки 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\"

K.A.V.
28-07-2011, 10:56
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

K.A.V.
28-07-2011, 12:06
Все равно выводится окно с 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
А реально, они появляются »
А вот как вы определяете флаг перезагрузки?

K.A.V.
28-07-2011, 13:59
Да, в случае выбора секции 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 нужно в кавычки заключить?

K.A.V.
28-07-2011, 16:35
unknown variable/constant "RestartExplorerSectionChecked" detected, ignoring (D:\NSIS\xnview.nsi:1523) »
Пропишите создание переменной в самое начало скрипта
Var RestartExplorerSectionChecked
и расскоменитруйте
!insertmacro MUI_UNPAGE_FINISH
и используйте мой пример, он рабочий, только что у себя проверял!




© OSzone.net 2001-2012