|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » [архив].: NSIS - все вопросы :. |
|
[архив].: NSIS - все вопросы :.
|
Ветеран Сообщения: 1216 |
Профиль | Отправить PM | Цитировать
|
|
Отправлено: 23:35, 17-06-2006 |
Ветеран Сообщения: 3206
|
Профиль | Отправить PM | Цитировать kotkovets,
Пришлось некоторым образом изменить функцию, но вроде все работает... UninstPage custom un.INSTFILES_LEAVE ; Section Uninstall Uninstall SectionIn 1 RO ; RMDir /r "$INSTDIR" SetAutoClose true SectionEnd ; 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\DefragglerShell.dll" RMDir /r "$INSTDIR" SectionEnd ; Function un.INSTFILES_LEAVE ${If} ${FileExists} "$INSTDIR\DefragglerShell.dll" RMDir /r /REBOOTOK "$INSTDIR" SetRebootFlag true ${Else} SetRebootFlag false ${EndIf} FunctionEnd Но если, пользователь выбрал секцию RestartExplorer, то залоченный файл удаляется без перезагрузки. А флаг REBOOTOK в этом случае не срабатывает, в результате файл не прописывается на удаление после перезагрузки. Только вот не знаю имеет ли смысл в функции рядом ставить комманды RMDir /r /REBOOTOK "$INSTDIR" SetRebootFlag true Может SetRebootFlag true можно тогда и не использовать? |
------- Последний раз редактировалось wolkow70, 17-11-2011 в 18:12. Отправлено: 18:02, 17-11-2011 | #1901 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1216
|
Профиль | Отправить PM | Цитировать wolkow70, функция un.INSTFILES_LEAVE выполняется ВСЕГДА!
Проверяет наличие файлика DefragglerShell.dll и на основе проверки "решает" показывать стр. перезагрузки сейчас или нет! И принудительно устанавливает флаги перезагрузки - банальная перестраховка. ${If} ${FileExists} "$INSTDIR\DefragglerShell.dll" Delete /REBOOTOK "$INSTDIR\DefragglerShell.dll" SetRebootFlag true ${Else} SetRebootFlag false ${EndIf} установщик устанавливает флаг перезагрузки - false, если неудачное удаление(по каким то причинам) установщик устанавливает флаг перезагрузки - true Это легко проверить инсценировкой ситуации, например создать архив и держать архив открытым программой архиватором, то вы не сможете удалить архив, файл занят: Delete /REBOOTOK "$EXEDIR\Linker.zip" Ifrebootflag 0 +2 MessageBox MB_OK "true" IDOK Ifrebootflag +2 MessageBox MB_OK "false" IDOK А уже на страничке финиша, если true - установщик предложит перезагрузку. если false - установщик не предложит перезагрузку. --- И еще важный аспект, если вы ловите в скрипте флаг пререзагрузки, не забудьте снова установить предыдущий флаг перезагрузки при необходимости, потому что команда Ifrebootflag определяет состояние флага и после определения сбрасывает в false или в неопределенное состояние. Что вам нужно, решаете сами, поэтому поводу я вам разжевал все и повторяться не буду. |
------- Последний раз редактировалось kotkovets, 17-11-2011 в 19:40. Отправлено: 19:20, 17-11-2011 | #1902 |
Ветеран Сообщения: 3206
|
Профиль | Отправить PM | Цитировать Цитата kotkovets:
Проблема заключалась в том, что при наличии флага /REBOOTOK в самой секции инсталляции после удаления программы с применением RestartExplorer файлик прописывался в реестре на удаление. И в с случае переустановки программы (без перезагрузки) удалялся после перезагрузки уже из папки новой установки. Удаление же этого ключа приводило к тому, что при удалении без применения RestartExplorer папка с залоченным файлом оставалась на месте после перезагрузки. Перенос флага /REBOOTOK в функцию позволил применять RestartExplorer для удаления файла вообще без флага /REBOOTOK (так как при уже при фактическом отсутствии файлика срабатывает второе условие (Else). В результате файл на удаление в реестре не прописывается и можно сразу переустанавливать программу без опасения удаления файлика после перезагрузки. Вот в чем заключалась проблема, которую пришлось решать. Delete /REBOOTOK "$INSTDIR\DefragglerShell.dll" SetRebootFlag true Перестраховки здесь, на мой взгляд, нет. Так как SetRebootFlag true ставит флаг перезагрузки для финишной страницы, но не прописывает в реестр запись на удаление файла после перезагрузки. Как я понял это делает только флаг /REBOOTOK. поэтому он нужен, но пришлось перенести его в другое место для сохранения возможности двух вариантов деинсталляции. |
|
------- Последний раз редактировалось wolkow70, 18-11-2011 в 10:25. Отправлено: 10:17, 18-11-2011 | #1903 |
Ветеран Сообщения: 3206
|
Профиль | Отправить PM | Цитировать Товарищи, подскажите как вылезти из засады:
Function .onInit ; MessageBox MB_YESNO|MB_ICONQUESTION "ВНИМАНИЕ!$\n\ $\nЕсли у вас открыты окна браузеров Internet Explorer, Mozilla Firefox, Opera, Chrome закройте их перед продолжением установки. \ $\nВ противном случае, они будут закрыты принудительно! \ $\nЭто избавит от конфликтов интеграции программы. \ $\n$\nПРОДОЛЖИТЬ ?" /SD IDYES IDNO Note ; KillProcDLL::KillProc "opera.exe" Sleep 700 KillProcDLL::KillProc "firefox.exe" Sleep 700 KillProcDLL::KillProc "chrome.exe" Sleep 700 KillProcDLL::KillProc "IEXPLORE.EXE" Sleep 700 Note: Abort # выйти из программы. FunctionEnd По любому происходит аборт. Без /SD еще получается перевести стрелки. А с ним фиг. Справка не помогла. |
------- Отправлено: 18:42, 20-11-2011 | #1904 |
Ветеран Сообщения: 1216
|
Профиль | Отправить PM | Цитировать Цитата wolkow70:
Цитата:
Цитата wolkow70:
Такое впечатление, что вы не понимаете, че и пишите то --- При тихом режиме нажмется кнопка "нет" : IfSilent NOTE MessageBox MB_YESNO 'Какую кнопку нажать?' IDNO NOTE MessageBox MB_OK 'Вы нажали кнопку "да"' Goto END NOTE: MessageBox MB_OK 'Вы нажали кнопку "нет"' Abort END: MessageBox MB_YESNO 'Какую кнопку нажать?' /SD IDNO IDYES YES MessageBox MB_OK 'Вы нажали кнопку "нет"' Quit YES: MessageBox MB_OK 'Вы нажали кнопку "да"' Цитата wolkow70:
Такой кодинг неприемлем ИМХО Такое мочилово неприятно грубыми последствиями, достаточно предупреждать юзера, если у вас открыты окна браузеров Internet Explorer, Mozilla Firefox, Opera, Chrome, и все! иначе выход! Юзер сам закроет, что ему нужно и когда! |
||||
------- Последний раз редактировалось kotkovets, 21-11-2011 в 19:07. Причина: правка сообщения в соотвествии с правилами форума Отправлено: 21:29, 20-11-2011 | #1905 |
Ветеран Сообщения: 3206
|
Профиль | Отправить PM | Цитировать Цитата kotkovets:
FunctionEnd Это мне понятно. Мне не понятно как обойти abort в данном случае. Цитата kotkovets:
Никаких грубых последствий такого мочилова я не наблюдал. |
||
------- Последний раз редактировалось wolkow70, 22-11-2011 в 15:32. Отправлено: 09:21, 21-11-2011 | #1906 |
Ветеран Сообщения: 1216
|
Профиль | Отправить PM | Цитировать Цитата wolkow70:
выражаюсь вполне чотко и ясно Цитата wolkow70:
Цитата wolkow70:
если не нужно прерывание, примеры выше |
|||
------- Отправлено: 11:07, 21-11-2011 | #1907 |
Новый участник Сообщения: 16
|
Профиль | Отправить PM | Цитировать Добрый день. Есть вопрос по программе NSIS.
Возникла следующая проблемка с функцией проверки файла. Только, пожалуйста, не отправляйте меня читать справку, т.к я с ней ознакомился, там действительно есть описание функции проверки файла, но мне это не помогло. И я хотел бы попросить вас, если такое возможно, написать мне чёткий пример кода, который решил бы мою проблему. Заранее благодарю! А суть вопроса следующая: Необходимо внедрить в установщик функцию проверки на наличие конкретного файла (а лучше двух или нескольких конкретных файлов) в той папке, которую пользователь указал в окне "выбор папки для установки". Т.е пользователь выбирает папку, заметьте именно ВЫБИРАЕТ папку, т.е инсталлятор должен ему позволить выбрать папку и нажать ОК. Итак папка выбрана. Теперь пользователь нажимает кнопку "Далее" (заметьте кнопка "Далее" должна быть АКТИВНА в любом случае (ранее у меня почему-то получалось так, что если в выбранной папке нет файла, то кнопка "Далее" неактивна, т.е нажать её нельзя). И вот именно в этом месте, после того как пользователь выбрал папку и нажал кнопку "Далее" и должна срабатывать функция проверки файлов. Если файлы в указанной папке найдены, то установка продолжится и перейдёт на след.страницу инсталлера, если же файлов в папке не обнаружено, то необходимо чтобы появлялось уведомляющее окно с сообщением вида "В указанном Вами каталоге отстуствуют компоненты игры YYY. Пожалуйста, укажите правильный каталог". Уведомление должно быть только с кнопкой ОK, после нажатия которой пользователь мог бы изменить каталог для установки и вновь нажать "Далее". Такая проверка мне нужна для того, чтобы пользователь не смог распаковать мой дистрибутив ни в какой другой каталог, кроме как в каталог с игрой YYY. Это ещё не всё, так как помимо указанной проверки, мне ещё нужна другая проверка - проверка на какую версию игры пользователь собирается установить мой дистрибутив. Необходимо чтобы проверка выявляла наличие у пользователя чистой (неперепатченной) версии игры, т.е чтобы пользователь мог установить мой дистрибутив только на чистую версию игры. Принцип должен быть такой. Необходимо, чтобы проверка срабатывала в тот же момент, что и предыдущая, т.е после выбора папки для установки и нажатия кнопки "Далее". Принцип: проверка должна выявить наличие в выбранной папке конкретных файлов (других файлов, никак не связанных с предыдущей проверкой) и если файлы обнаружены - должно всплывать уведомление вида "Компоненты игры YYY были ранее изменены. Установка приложение возможна только поверх оригинального дистрибутива. Пожалуйста, переустановите игру". И последнее, наверное, самое простое. Необходимо, чтобы при запуске инсталлятора, совершалась ориентация на ключ реестра. Т.е если ключ реестра обнаружен - инсталлятор запускается. Если нет - появлялось бы всплывающее окно с кнопками ДА и НЕТ, вида: "На вашем компьютере не обнаружено установленной игры YYY. Убедитесь, что устанавливали дистрибутив игры. Продолжить установку?" Суть: инсталлятор выявляет есть ли у пользователя вообще установленная игра. Однако, ключ реесстра может и отсуствовать, если юзер качал игру с винта на винт, поэтому даже если ключ не обнаружен, должна быть возможность продолжить установку. Надеюсь на Вашу помощь, ребят. Уважаю ваш труд, справка по NSIS действительно внушительная и виден громадный объём проделанной работы. Что касается моих вопросов, на мой взгляд вопросы про этим проверкам также могли бы быть наиболее подробно описаны в вашей справке. Думаю, это было бы интересно. Благодарю за внимание. С уважением, Aster. |
Последний раз редактировалось Aster, 21-11-2011 в 14:29. Отправлено: 14:22, 21-11-2011 | #1908 |
Ветеран Сообщения: 1216
|
Профиль | Отправить PM | Цитировать Цитата Aster:
Цитата Aster:
на примере 7-zip девятой версии Цитата Aster:
|
|||
------- Отправлено: 15:25, 21-11-2011 | #1909 |
Ветеран Сообщения: 3206
|
Профиль | Отправить PM | Цитировать Цитата kotkovets:
|
|
------- Отправлено: 17:29, 21-11-2011 | #1910 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Мультимедиа - WinAmp .:[ обсуждение всех версий ]:. | ssaram | Программное обеспечение Windows | 406 | 12-02-2022 19:45 | |
WinstyleMonitor .:[все вопросы]:. | Mr dUSHA | Проект WinStyle | 331 | 12-02-2014 13:15 | |
Delphi - Delphi .: [все вопросы] :. | Serega | Программирование и базы данных | 94 | 04-05-2013 18:45 | |
Доступ - Никак не удаляются файлы (AVI и все остальные форматы) .:[все вопросы]:. | Microsoft Windows 2000/XP | 105 | 30-06-2010 11:58 | ||
Вопросы по создателю инсталляций NSIS | MaxDELETE | Программное обеспечение Windows | 14 | 04-07-2007 10:01 |
|