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
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

sawe
29-07-2011, 16:29
Случайно вы не знаете, как скрыть от посторонних возможность просмотра содержимого инсталлятора, не прибегая к 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