Показать полную графическую версию : [архив].: NSIS - все вопросы :.
kotkovets
29-07-2011, 14:48
wolkow70, А почему бы не сделать, вот так, проверять в функции перед финишем , есть ли залоченный файл, то предложить о перезагрузке, а если нету файла, то не предлагать - это будет корректнее..
!include "MUI2.nsh"
Name "Modern UI Test"
OutFile "UnFinish.exe"
InstallDir "C:\Test_Modern"
!insertmacro MUI_PAGE_INSTFILES
;----------------------------------
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
UninstPage custom un.INSTFILES_LEAVE
!insertmacro MUI_UNPAGE_FINISH
!insertmacro MUI_LANGUAGE "English"
Section Install
SetOutPath "$INSTDIR"
WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd
Section Uninstall
Sectionin RO
;тут стандартное удаление
SectionEnd
Section un.Restart RestartExplorer
;тут нестандартное удаление, с перезагрузкой проводника
SectionEnd
Function un.INSTFILES_LEAVE
${If} ${FileExists} "путь к залоченному файлу" ;или папка т.е наличие папки
SetRebootFlag true ;если есть файл, предлагать перезагрузку
${Else}
SetRebootFlag false ;если нету файла, не предлагать перезагрузку
${EndIf}
FunctionEnd
wolkow70
29-07-2011, 14:55
wolkow70, А почему бы не сделать, вот так, проверять в функции перед финишем , есть ли залоченный файл, то предложить о перезагрузке, а если нету файла, то не предлагать - это будет корректнее.. »
А потому, что он в любом случае есть в этой программе. Я же сам пишу скрипт и тестирую программы. Да и какой интерес удалять с перезагрузкой? Неудобно... Мы же с Вами обсуждали уже этот вопрос.
kotkovets
29-07-2011, 15:18
wolkow70, Все это делается в деинсталяторе, цель - удалить чисто, без остатков. При перезагрузке проводника не всегда удаляется залоченный файл - есть и другие причины, не раз с этим сталкивался, в секциях деинсталла команды удаления оставляйте как есть, ведь секции деинсталла выполняются раньше функции! Тем более, с /REBOOTOK - удалится при перезагрузке
"Предпоследняя" функция деисталла только проверит наличие залоченного файла и даст нужное предложение. Вот весь функционал - прост и незатейлив.
wolkow70
29-07-2011, 16:20
kotkovets,
Протестировал несколько раз с установкой самой программы. ВСЕ РАБОТАЕТ ОТЛИЧНО! И на Windows7 тоже. Спасибо.
В конечном виде так:
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
UninstPage custom un.INSTFILES_LEAVE
!insertmacro MUI_UNPAGE_FINISH
Section Uninstall Uninstall
!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED "$INSTDIR\ShellEx\XnViewShellExt.dll"
;
;
RMDir /r /REBOOTOK "$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\ShellEx\XnViewShellExt.dll"
RMDir /r "$INSTDIR\ShellEx\"
RMDir /r "$INSTDIR\"
SectionEnd
Function un.INSTFILES_LEAVE
${If} ${FileExists} "$INSTDIR\ShellEx\XnViewShellExt.dll" ;или папка т.е наличие папки
SetRebootFlag true ;если есть файл, предлагать перезагрузку
${Else}
SetRebootFlag false ;если нету файла, не предлагать перезагрузку
${EndIf}
FunctionEnd
Случайно вы не знаете, как скрыть от посторонних возможность просмотра содержимого инсталлятора, не прибегая к cript.DLL.
Антивирусники её не любят.
kotkovets
29-07-2011, 16:46
sawe,
Через http://nsis.sourceforge.net/DcryptDll_plug-in "расшифровываем" указанные файлы
Через утилиты в архиве NGenKeys.exe и Ncrypt.exe - во время компиляции проекта криптуем файлы (запуск препроцессором NSIS) - не раз такое делал и антивирусы, не замечал, что визжали...
wolkow70
29-07-2011, 16:56
kotkovets,
Читаю вашу публикацию в справке
DeleteRegKey (/ifempty) [root_key] [subkey]
Удаляет раздел реестра subkey из ветки root_key.
Если вызывается с параметром /ifempty, то удаление происходит только в том случае, если раздел пустой.
Флаг ошибки будет установлен в том случае, если раздел не найден, или удаление невозможно.
DeleteRegKey HKLM "Software\My Company\My Software"
DeleteRegKey /ifempty HKLM "Software\A key that might have subkeys"
Удалится ли ключ реестра, если ему не присвоено значение по умолчанию, но имеются подключи?
Напрмер :
HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dib" ""
HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dib\UserChoice" "Progid"
Мне надо, что бы только полностью пустые ключи удалялись..
kotkovets
29-07-2011, 17:02
DeleteRegKey /ifempty »
Ключ удаляется, только если он пустой: без параметров и подключей (подразделов)
если сравнивать с файловой структурой, то означает удалить пустую папку
wolkow70
30-07-2011, 14:12
Товарищи, вопрос ламерский (извините):
Распаковались файлы в директорию установки.
Предположим в папках 5.1 и 6.1 находятся файлы, которые должны быть скопированы (или перемещены) в Windows\system32
Если XP, то копируется (или перемещается) файл из папки 5.1.
Если Vista или W7, то из папки 6.1.
Там файлы с одинаковыми наименованиями , но разными версиями (под систему)
Подскажите как рациональней реализовать?
kotkovets
30-07-2011, 14:30
wolkow70, подключаем библиотеку для работы с различными версиями Windows
!include WinVer.nsh
Далее в скрипте
${If} ${AtMostWinXP}
SetOutPath $SYSDIR
File /r "5.1\*"
${ElseIf} ${AtLeastWinVista}
SetOutPath $SYSDIR
File /r "6.1\*"
${EndIf}
Что из этого получается? При компиляции проекта в установщике будут 2 версии файлов, в зависимости от версии Windows нужный набор файлов будут скопирован в системную директорию
Painkiller
31-07-2011, 14:16
Господа, подскажите. Почему не работает команды makensis.exe /X"SetCompressor /FINAL lzma" myscript.nsi и makensis.exe myscript.nsi. Пишет makensis.exe не являеться внутренней или внешней командой . Подскажите правильную реализацию ?
Krinkels
31-07-2011, 14:32
Painkiller
У меня такая же бадяга была с gcc, компилировал через батник. Вылечил так: прописал полный путь к exe.
Вот пример:
@set path=C:\PROGRA~1\gcc\MinGW\bin
%path%\gcc.exe ...
Painkiller
31-07-2011, 14:45
Painkiller
У меня такая же бадяга была с gcc, компилировал через батник. Вылечил так: прописал полный путь к exe.
Вот пример:
Код:
@set path=C:\PROGRA~1\gcc\MinGW\bin
%path%\gcc.exe ... »
Спасибо! Помогло. Вот как реализовал :
@set path=C:\PROGRA~1\NSIS
C:\PROGRA~1\NSIS\makensis.exe ...
makensis.exe myscript.nsi
Krinkels
31-07-2011, 15:40
Painkiller
@set path=C:\PROGRA~1\NSIS C:\PROGRA~1\NSIS\makensis.exe ... makensis.exe myscript.nsi »
Ты немного не понял, "..." это значит что дальше идет текст который не имеет смысла писать :)
@set path=C:\PROGRA~1\NSIS
%path%\makensis.exe myscript.nsi
Так думаю будет правильнее
Painkiller
31-07-2011, 16:42
@set path=C:\PROGRA~1\NSIS
%path%\makensis.exe myscript.nsi
Так думаю будет правильнее »
А вот так не работает
kotkovets
31-07-2011, 17:04
Painkiller,
Чем заводится makensis?, батником, внешней прогой или скриптом NSIS?
Painkiller
31-07-2011, 17:59
Painkiller,
Чем заводится makensis?, батником, внешней прогой или скриптом NSIS? »
Моя программа создаёт временный батник. Его запускает и ждёт пока батник отработает . Батник заводит makensis. А прога удаляет временный батник. Пока только такой рабочий вариант нашёл =(
kotkovets
31-07-2011, 18:18
Моя программа создаёт временный батник »
Вот это да!
Есть же апи...Вы же пишете на делфи, создаете процесс, передаете параметры, или вам привести пример на дельфи или по гуглите...
CreateProcess - создает процесс (с константой DETACHED_PROCESS - запустит консоль в скрытом режиме)
WaitForSingleObject - заставляет прогу ожидать завершения процесса (константа INFINITE)
GetExitCodeProcess - отслеживает код возврата процесса
http://www.delphisources.ru/pages/faq/base/createprocess_console.html
пишу на с++ иногда
Painkiller
31-07-2011, 18:39
Цитата Painkiller:
Моя программа создаёт временный батник »
Вот это да!
Есть же апи...Вы же пишете на делфи, создаете процесс, передаете параметры, или вам привести пример на дельфи или по гуглите...
CreateProcess - создает процесс (с константой DETACHED_PROCESS - запустит консоль в скрытом режиме)
WaitForSingleObject - заставляет прогу ожидать завершения процесса (константа INFINITE)
GetExitCodeProcess - отслеживает код возврата процесса »
Апи не люблю. Вы бы мне подсказали как одной строкой запустить makensis?
kotkovets
31-07-2011, 18:52
Апи не люблю »
апи не надо не любить, а пользоваться, эти функции объявлены в "заголовках" дельфи..
в батниках я не спец, но обязательно нужно опредилить путь к makensis и полный путь к скрипту
${NSISDIR}\makensis.exe "путь к скрипту"
Вам пример привести на делфи или на nsis посредством апи?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC