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

wolkow70
17-11-2011, 18:02
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

То есть, перенес комманду RMDir /r /REBOOTOK "$INSTDIR" из Uninstall в саму функцию un.INSTFILES_LEAVE. Таким образом, если Пользователь не выбрал секцию RestartExplorer, то залоченный файл остается на месте и не прописывается на удаление. Зато, затем он все равно удаляется с перезагрузкой через комманду функции. Получается как бы вариант стандартного удаления.
Но если, пользователь выбрал секцию RestartExplorer, то залоченный файл удаляется без перезагрузки. А флаг REBOOTOK в этом случае не срабатывает, в результате файл не прописывается на удаление после перезагрузки.
Только вот не знаю имеет ли смысл в функции рядом ставить комманды
RMDir /r /REBOOTOK "$INSTDIR"
SetRebootFlag true
Может SetRebootFlag true можно тогда и не использовать?

kotkovets
17-11-2011, 19:20
wolkow70, функция un.INSTFILES_LEAVE выполняется ВСЕГДА!
Проверяет наличие файлика DefragglerShell.dll и на основе проверки "решает" показывать стр. перезагрузки сейчас или нет!
И принудительно устанавливает флаги перезагрузки - банальная перестраховка.
${If} ${FileExists} "$INSTDIR\DefragglerShell.dll"
Delete /REBOOTOK "$INSTDIR\DefragglerShell.dll"
SetRebootFlag true
${Else}
SetRebootFlag false
${EndIf}
И еще один момент, если удаление задано с флагом /REBOOTOK, но файлы или файл удалились удачно,
установщик устанавливает флаг перезагрузки - 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 или в неопределенное состояние.
Delete /REBOOTOK "$EXEDIR\Linker.zip"
Ifrebootflag 0 +3
MessageBox MB_OK "true" IDOK
SetRebootFlag true
Ifrebootflag +3
MessageBox MB_OK "false" IDOK
SetRebootFlag false

Что вам нужно, решаете сами, поэтому поводу я вам разжевал все и повторяться не буду.

wolkow70
18-11-2011, 10:17
функция un.INSTFILES_LEAVE выполняется ВСЕГДА! »
Это и замечательно! Это и позволило перенести в нее флаг /REBOOTOK.
Проблема заключалась в том, что при наличии флага /REBOOTOK в самой секции инсталляции после удаления программы с применением RestartExplorer файлик прописывался в реестре на удаление. И в с случае переустановки программы (без перезагрузки) удалялся после перезагрузки уже из папки новой установки. Удаление же этого ключа приводило к тому, что при удалении без применения RestartExplorer папка с залоченным файлом оставалась на месте после перезагрузки.
Перенос флага /REBOOTOK в функцию позволил применять RestartExplorer для удаления файла вообще без флага /REBOOTOK (так как при уже при фактическом отсутствии файлика срабатывает второе условие (Else). В результате файл на удаление в реестре не прописывается и можно сразу переустанавливать программу без опасения удаления файлика после перезагрузки.
Вот в чем заключалась проблема, которую пришлось решать.

Delete /REBOOTOK "$INSTDIR\DefragglerShell.dll"
SetRebootFlag true
Перестраховки здесь, на мой взгляд, нет. Так как SetRebootFlag true ставит флаг перезагрузки для финишной страницы, но не прописывает в реестр запись на удаление файла после перезагрузки. Как я понял это делает только флаг /REBOOTOK. поэтому он нужен, но пришлось перенести его в другое место для сохранения возможности двух вариантов деинсталляции.

wolkow70
20-11-2011, 18:42
Товарищи, подскажите как вылезти из засады:

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 еще получается перевести стрелки. А с ним фиг. Справка не помогла.

kotkovets
20-11-2011, 21:29
А с ним фиг. Справка не помогла »
Хреново Вы ее читаете:
Если в команде не указан ни один из идентификаторов, установщик возвращает их в 0 (по умолчанию).
Максимум возможно задать два идентификатора кнопок, не указанный индетификатор кнопки возвратится в 0.

По любому происходит аборт »
А вы всегда на эту команду выйдете однозначно, подумайте почему!?
Такое впечатление, что вы не понимаете, че и пишите то :o
---
При тихом режиме нажмется кнопка "нет" :
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 'Вы нажали кнопку "да"'
Если у вас открыты окна браузеров Internet Explorer, Mozilla Firefox, Opera, Chrome»
Так вы их проверяйте, что они открыты(открыт один из них), а то тупо просто мочится - вообще жесть!
Такой кодинг неприемлем ИМХО :shocked:
Такое мочилово неприятно грубыми последствиями, достаточно предупреждать юзера, если у вас открыты окна браузеров Internet Explorer, Mozilla Firefox, Opera, Chrome, и все! иначе выход! Юзер сам закроет, что ему нужно и когда!

wolkow70
21-11-2011, 09:21
А вы всегда на эту команду выйдете однозначно, подумайте почему!? »
Abort # выйти из программы.
FunctionEnd

Это мне понятно. Мне не понятно как обойти abort в данном случае.

Так вы их проверяйте, что они открыты (открыт один из них), а то тупо просто мочится - вообще жесть!
За такой кодинг я бы я**а натянул на одно место
Такое мочилово неприятно грубыми последствиями, достаточно предупреждать юзера, если у вас открыты окна браузеров Internet Explorer, Mozilla Firefox, Opera, Chrome, и все! иначе выход! Юзер сам закроет, что ему нужно и когда! »

Юзеры бывают разные, и я не себя имею в виду. Кроме того, речь идет об адаптации под тихую установку, значит принудительное закрытие окон допустимо, если юзер сам их не закрыл.
Никаких грубых последствий такого мочилова я не наблюдал.

kotkovets
21-11-2011, 11:07
Кроме того, Вы следите за своей фразеологией, »
Если я столь грубо выразился, то приношу извинения...
выражаюсь вполне чотко и ясно :)
Юзеры бывают разные »
Это ясно, не нужно думать головой установщика и навязывать это юзеру.
Мне не понятно как обойти abort в данном случае »
последовательность, уважаемый забыли и прыжок,
если не нужно прерывание, примеры выше

Aster
21-11-2011, 14:22
Добрый день. Есть вопрос по программе NSIS.
Возникла следующая проблемка с функцией проверки файла.
Только, пожалуйста, не отправляйте меня читать справку, т.к я с ней ознакомился, там действительно есть описание функции проверки файла, но мне это не помогло. И я хотел бы попросить вас, если такое возможно, написать мне чёткий пример кода, который решил бы мою проблему. Заранее благодарю!

А суть вопроса следующая:
Необходимо внедрить в установщик функцию проверки на наличие конкретного файла (а лучше двух или нескольких конкретных файлов) в той папке, которую пользователь указал в окне "выбор папки для установки". Т.е пользователь выбирает папку, заметьте именно ВЫБИРАЕТ папку, т.е инсталлятор должен ему позволить выбрать папку и нажать ОК. Итак папка выбрана. Теперь пользователь нажимает кнопку "Далее" (заметьте кнопка "Далее" должна быть АКТИВНА в любом случае (ранее у меня почему-то получалось так, что если в выбранной папке нет файла, то кнопка "Далее" неактивна, т.е нажать её нельзя). И вот именно в этом месте, после того как пользователь выбрал папку и нажал кнопку "Далее" и должна срабатывать функция проверки файлов. Если файлы в указанной папке найдены, то установка продолжится и перейдёт на след.страницу инсталлера, если же файлов в папке не обнаружено, то необходимо чтобы появлялось уведомляющее окно с сообщением вида "В указанном Вами каталоге отстуствуют компоненты игры YYY. Пожалуйста, укажите правильный каталог". Уведомление должно быть только с кнопкой ОK, после нажатия которой пользователь мог бы изменить каталог для установки и вновь нажать "Далее". Такая проверка мне нужна для того, чтобы пользователь не смог распаковать мой дистрибутив ни в какой другой каталог, кроме как в каталог с игрой YYY.

Это ещё не всё, так как помимо указанной проверки, мне ещё нужна другая проверка - проверка на какую версию игры пользователь собирается установить мой дистрибутив. Необходимо чтобы проверка выявляла наличие у пользователя чистой (неперепатченной) версии игры, т.е чтобы пользователь мог установить мой дистрибутив только на чистую версию игры. Принцип должен быть такой. Необходимо, чтобы проверка срабатывала в тот же момент, что и предыдущая, т.е после выбора папки для установки и нажатия кнопки "Далее". Принцип: проверка должна выявить наличие в выбранной папке конкретных файлов (других файлов, никак не связанных с предыдущей проверкой) и если файлы обнаружены - должно всплывать уведомление вида "Компоненты игры YYY были ранее изменены. Установка приложение возможна только поверх оригинального дистрибутива. Пожалуйста, переустановите игру".

И последнее, наверное, самое простое.
Необходимо, чтобы при запуске инсталлятора, совершалась ориентация на ключ реестра.
Т.е если ключ реестра обнаружен - инсталлятор запускается. Если нет - появлялось бы всплывающее окно с кнопками ДА и НЕТ, вида: "На вашем компьютере не обнаружено установленной игры YYY. Убедитесь, что устанавливали дистрибутив игры. Продолжить установку?" Суть: инсталлятор выявляет есть ли у пользователя вообще установленная игра. Однако, ключ реесстра может и отсуствовать, если юзер качал игру с винта на винт, поэтому даже если ключ не обнаружен, должна быть возможность продолжить установку.

Надеюсь на Вашу помощь, ребят. Уважаю ваш труд, справка по NSIS действительно внушительная и виден громадный объём проделанной работы.
Что касается моих вопросов, на мой взгляд вопросы про этим проверкам также могли бы быть наиболее подробно описаны в вашей справке. Думаю, это было бы интересно.

Благодарю за внимание.
С уважением, Aster.

kotkovets
21-11-2011, 15:25
Уважаю ваш труд, справка по NSIS действительно внушительная и виден громадный объём проделанной работы »
Спасибо на добром слове.
Такая проверка мне нужна для того, чтобы пользователь не смог распаковать мой дистрибутив ни в какой другой каталог, кроме как в каталог с игрой YYY. »
В таком случае страничка выбора директории неуместна.
на примере 7-zip девятой версии
!include "MUI2.nsh"
!include "FileFunc.nsh"

InstallDirRegKey HKCU "Software\7-Zip" "Path" ;берем путь из реестра, в противном случае ниже код.
InstallDir "$PROGRAMFILES\7-zip"

!insertmacro MUI_PAGE_WELCOME
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE LEAVE_COMPONENTS ;функция будет выполнена при закрытии странички компонентов
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE English

Name "Test"
OutFile "Test.exe"
ShowInstDetails show

Function LEAVE_COMPONENTS
${IfNot} ${FileExists} "$INSTDIR\7z.exe"
${OrIfNot} ${FileExists} "$INSTDIR\7z.dll" ;логика ИЛИ-НЕ ;при необходимости пишем еще раз на указанный ваш файл
MessageBox MB_OK "Не найден один из файлов!" IDOK
Abort ;прерывание
${Else}
;Здесь можно писать код проверки версии файлов и изменения файлов
${GetFileVersion} "$INSTDIR\7z.exe" $0 ; выявляем версию файла
StrCpy $0 $0 1 ;берем из версии первую циферку(один первый символ)
;сравниваем версию
${If} $0 != 9
MessageBox MB_OK "Это не 9 версия файла 7z" IDOK
Abort
${EndIf}
;сравниваем пропатченный файл или нет плагом MD5
;;
;;

${EndIf}
FunctionEnd

Section MAIN
SectionEnd
Section MAIN_1
SectionEnd
Принцип: проверка должна выявить наличие в выбранной папке конкретных файлов (других файлов, никак не связанных с предыдущей проверкой) и если файлы обнаружены - должно всплывать уведомление вида "Компоненты игры YYY были ранее изменены »
На офф. сайте найдите плагин MD5 и сверьте хэш-сумму оригинала, если не сходится прерывание.

wolkow70
21-11-2011, 17:29
последовательность, уважаемый забыли и прыжок,
если не нужно прерывание, примеры выше »

Оба ваших примера в моем случае не работают, точнее говоря работают при обычной установке. но при тихой не работают. Потому как, мне в тихом режиме нужно нажать кнопку "да", а не "нет, что реализуют приведенные вами примеры. А это и не удается сделать, так как в этом случае abort не перепрыгнуть.

Aster
21-11-2011, 17:30
kotkovets
Спасибо за отклик!

В таком случае страничка выбора директории неуместна.
на примере 7-zip девятой версии »

Нет. Уместна. Мне нужна проверка именно в таком виде, как я описал.
Именно, чтобы пользователь указывал каталог для установки и нажимал "Далее".
Если он указал его неправильно - должно всплыть сообщение о неправильном каталоге.
А Вы мне привели пример выполнения функции проверки при "закрытии страницы с компонентами".
При этом у Вас в примере путь проверяемого файла берётся из реестра или из папки Program Files. Про реестр я написал отдельно, не факт что ключ есть в рестре. А Program Files мне вообще никак тут не нужна. Игра у пользователя может быть установлена где угодно вообще. Именно поэтому мне необходимо, чтобы пользователь САМ указывал папку для установки и нажимал "Далее". И после этого шла бы проверка. Ничего другое мне не подходит.

На офф. сайте найдите плагин MD5 и сверьте хэш-сумму оригинала, если не сходится прерывание. »
Это уже, к сожалению, за гранью моего понимания (

____________________________________________

Имеется к Вам предложение.
Наш проект высочайшей технической сложности.
Это обширное дополнение для игры. Требует высококачественного инсталлятора. Основы я знаю, проблемы лишь вот с такими доп.функциями, как проверки.
Мы уже много лет занимаемся выпуском комплексных патчей и у нас тысячи пользователей, ждущих релиза. Дабы не заниматься рекламой - умышленно не называю имя проекта.
Для создания инсталляторов у нас был отдельный человек, который создавал прекрасные инсталлы на основе Ghost Installer. В этом году он отошёл от дел и инсталлер вынужден делать я. Как Вы понимаете, должно быть не хуже чем было. Не хуже ни по функционалу, ни по оформлению. Так вот, если вы понимаете что именно я хочу реализовать по поводу проверок, могу ли я рассчитывать на Вашу ПРЯМУЮ помощь? Т.е Вы, по возможности подготовите уже готовые коды для необходимых нам функций. Если Вы согласны поучаствовать напрямую в создании инсталлятора - мы могли бы связаться с вами по ICQ, я бы вам поведал об обширности проекта и всей серьёзности дела.

Проект некоммерческий и денег, к сожалению, я вам предложить не могу.
Но обещаю Вам персональную благодарность в списке авторов, а также по Вашему желанию указать ссылку на Ваш ресурс или какие-либо другие координаты.
Вы также можете привлечь Ваших коллег по данному ремеслу.
Будем рады сотрудничеству.

Жду Вашего решения.

wolkow70
21-11-2011, 17:31
Если я столь грубо выразился, то приношу извинения... »Только извинений недостаточно. В таких случаях принято и сообщение поправить. Ведь, сюда люди иногда заходят почитать.

MKN
21-11-2011, 17:51
Только извинений недостаточно. »
Ты тоже деликатностью не блещишь : :)
del - тут была плохая фраза»
Прям как в зоновском бараке, а не на обсуждении скриптов... :)

wolkow70
21-11-2011, 18:12
kotkovets,

Немного изменил формат сообщения и все получилось :)

Function .onInit
MessageBox MB_YESNO|MB_ICONQUESTION "ВНИМАНИЕ!$\n\
$\nЕсли у вас открыты окна браузеров Internet Explorer, Mozilla Firefox, Opera, Chrome закройте их перед продолжением установки. \
$\nВ противном случае, они будут закрыты принудительно! \
$\nЭто избавит от конфликтов интеграции программы. \
$\n$\nПРОДОЛЖИТЬ ?" /SD IDYES IDYES continue IDNO close
;
close:
Abort
continue:
;
KillProcDLL::KillProc "opera.exe"
Sleep 700
KillProcDLL::KillProc "firefox.exe"
Sleep 700
KillProcDLL::KillProc "chrome.exe"
Sleep 700
KillProcDLL::KillProc "IEXPLORE.EXE"
Sleep 700
FunctionEnd

Ты тоже деликатностью не блещишь : »

kotkovets
21-11-2011, 18:32
но при тихой не работают. Потому как, мне в тихом режиме нужно нажать кнопку "да", а не "нет, что реализуют »
^
Прям как в зоновском бараке, а не на обсуждении скриптов... »
А что делать, когда не понимают, того что делают и на пальцах когда уже показал.
Нет. Уместна. Мне нужна проверка именно в таком виде, как я описал.
Именно, чтобы пользователь указывал каталог для установки и нажимал "Далее".
Если он указал его неправильно - должно всплыть сообщение о неправильном каталоге.
А Вы мне привели пример выполнения функции проверки при "закрытии страницы с компонентами".
При этом у Вас в примере путь проверяемого файла берётся из реестра или из папки Program Files. Про реестр я написал отдельно, не факт что ключ есть в рестре. А Program Files мне вообще никак тут не нужна. Игра у пользователя может быть установлена где угодно вообще. Именно поэтому мне необходимо, чтобы пользователь САМ указывал папку для установки и нажимал "Далее". И после этого шла бы проверка. Ничего другое мне не подходит. »
Это всего лишь пример и не нужно его дословно воспринимать как так и нужно !
Это основа!
Коль Вы в справку просили не тыкать, но все же придется на счет команд:
InstallDirRegKey
Раз нужно так делаем так:
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE LEAVE_DIRECTORY
!insertmacro MUI_PAGE_DIRECTORY
---
Function LEAVE_DIRECTORY
;переносим код с функции LEAVE_COMPONENTS <-- и эту функцию и упраздняем.
FunctionEnd
На офф. сайте найдите плагин MD5 и сверьте хэш-сумму оригинала »
Это элементарно, примеры есть там, плагином проверяем хэш оригинального файла - запоминаем циферки. Во время установки плагином проверяем хэш сумму файла.
Сравниваем хэш оргинала и хэш файла, точно как, как проверку версии.
Если ключ реестра не найден, то команда InstallDir "bla bla" - не нужна.
Откроется страничка директории без выбранного пути.
Жду Вашего решения »
Скажу так, двояково, с нуля не буду писать, нужна помощь - помогу (в личку).
Я в играх плохо разбираюсь :)
---
wolkow70, методом упрощения, не обязательно указывать на второй индетификатор, он сам туда придет :)
MessageBox MB_YESNO|MB_ICONQUESTION "ВНИМАНИЕ!$\n\
$\nЕсли у вас открыты окна браузеров Internet Explorer, Mozilla Firefox, Opera, Chrome закройте их перед продолжением установки. \
$\nВ противном случае, они будут закрыты принудительно! \
$\nЭто избавит от конфликтов интеграции программы. \
$\n$\nПРОДОЛЖИТЬ ?" /SD IDYES IDYES continue
Abort
continue:
;---

wolkow70
22-11-2011, 15:42
Alexey_KF,

Я сам собираюсь делать сборку на пятую версию Eset. Вы бы изложили свои соображения по сборке. Может совместными усилиями что-нибудь сделаем.
Для четверки я делал раньше так:

!define PRODUCT_NAME "Eset Smart Security"
!define PRODUCT_VERSION "4.2.71.3"
!define pkgdir "D:\NSIS"
!define MUI_WELCOMEFINISHPAGE_BITMAP "${pkgdir}\ESS32\Eset.bmp"
; MUI 1.67 compatible ------
!include "MUI.nsh"
SetCompressor /SOLID lzma
SetCompressorDictSize 32

!define MUI_ABORTWARNING
!define MUI_ICON "${pkgdir}\ESS32\Eset.ico"

; MUI Settings
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Name "${PRODUCT_NAME}"
Caption "Установка ${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile ESSv4.exe
VIProductVersion "4.2.71.3 "
!define /date date "%H:%M %d %b, %Y"
VIAddVersionKey /LANG=1049 "LegalCopyright" "Eset"
VIAddVersionKey /LANG=1049 "Comments" "Built on ${date}"
VIAddVersionKey /LANG=1049 "CompanyName" "wolkow70"
VIAddVersionKey /LANG=1049 "FileVersion" "4.2.71.3 "
VIAddVersionKey /LANG=1049 "FileDescription" "Eset Smart Security"
SubCaption 3 " "
!include IsUserAdmin.nsh
!include FileFunc.nsh
!insertmacro GetRoot
!insertmacro DriveSpace
Function .onInit
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "ESSSetup") i .r1 ?e'
Pop $R0
StrCmp $R0 0 +3
MessageBox MB_OK|MB_ICONQUESTION|MB_TOPMOST "Установка Eset Smart Security уже запущена..."
Abort
ReadRegDWORD $0 HKLM SYSTEM\Setup SystemSetupInProgress
IntCmp $0 1 0 +2
SetSilent silent
${GetRoot} "$WINDIR" $R0
${DriveSpace} "$R0" "/D=F /S=M" $R1
IntCmp $R1 100 +3 0 +3
MessageBox MB_OK|MB_ICONEXCLAMATION|MB_TOPMOST "На системном диске должно быть более$\n100 мегабайт свободного места.$\nУстановка Eset Smart Security отменена!"
Abort
!insertmacro IsUserAdmin $R0
StrCmp $R0 1 +3
MessageBox MB_OK|MB_ICONEXCLAMATION|MB_TOPMOST "Для установки программы у пользователя$\nдолжны быть права администратора.$\nУстановка Eset Smart Security отменена!"
Abort
FunctionEnd

Section "!${PRODUCT_NAME}" ESS
SectionIn RO
SetOutPath "$TEMP\ESSSetup"
File /r "Distrib\*"
ExecWait "msiexec.exe /i $\"$TEMP\ESSSetup\ess_nt32_rus.msi$\" /qn REBOOT=ReallySuppress"
SetOutPath "$TEMP"
RMDir /r "$TEMP\ESSSetup"
SectionEnd

LangString message ${LANG_ENGLISH} "Here is in English"
LangString message ${LANG_RUSSIAN} "А тут по русски"
LangString DESC_ESS ${LANG_RUSSIAN} "Будет установлен пакет защиты компьютера от вирусов и интернет-угроз ${PRODUCT_NAME} ${PRODUCT_VERSION}"

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${ESS} $(DESC_ESS)
!insertmacro MUI_FUNCTION_DESCRIPTION_END

Сейчас хочу что-нибудь поинтереснее сделать.

MKN
22-11-2011, 17:00
Обновился NSIS Dialog Designer до v 0.9.9 (http://coolsoft.altervista.org/en/nsisdialogdesigner)
Только у меня под XPx32 (другой ОС нет под рукой) - не работает.
Запускается с ошибкой - Runtime error: и т.д. целая портянка. После закрытия окна с сообщением об ошибке, запускается без тулбара... У кого какие результаты с этой версией ?

wolkow70
22-11-2011, 20:08
Товарищи, подскажите есть ли какая-то ошибка в моем коде.
На x86 все нормально регистрируется. Юзеры пишут, что на x64 не функционирует контекстное меню.

Section "Использовать расширенную оболочку XnView" XnViewShell
SectionIn 1 2

SetOutPath "$INSTDIR" ; - подключить директорию установки
;
${If} ${RunningX64} ; открыть логическую конструкцию, и если запущена х64
SetOutPath "$INSTDIR\XnShellEx64" ; - подключить путь
RegDLL "$INSTDIR\XnShellEx64\XnViewShellExt.dll" ; - зарегистрировать

${Else} ; - иначе, если не x64

SetOutPath "$INSTDIR\ShellEx" ; -подключить путь
RegDLL "$INSTDIR\ShellEx\XnViewShellExt.dll" ; - зарегистрировать

${EndIf} ; - закрыть логическую конструкцию

WriteRegStr HKCU "Software\XnView\ShellEx" "Language" "ru"

SectionEnd

kotkovets
22-11-2011, 20:51
wolkow70
XnViewShellExt.dll - файл должен быть именно для x64
иногда, встречается не часто, одна библиотека для разрядности систем.

${If} ${RunningX64} ; открыть логическую конструкцию, и если запущена х64
SetOutPath "$INSTDIR\XnShellEx64"
ExecWait `regsvr32 /s "$INSTDIR\XnShellEx64\XnViewShellExt.dll"` $0
;MessageBox MB_OK "код возврата: $0" IDOK
;если удачно, то $0 = 0, если $0 = 3 --> модуль не найден
${Else}
RegDLL "$INSTDIR\ShellEx\XnViewShellExt.dll"
${EndIf}
WriteRegStr HKCU "Software\XnView\ShellEx" "Language" "ru"

Будет время гляну, что и почему и как...
---
Глянул... для оболочки в x64 нужен 64-разрядный XnViewShellExt.dll
XnView Shell Extension ZIP 64bits (http://download.xnview.com/XnShellEx64.zip)

wolkow70
23-11-2011, 13:46
XnViewShellExt.dll - файл должен быть именно для x64 »
Он и есть для X64. Отдельно скачивается с офсайта.




© OSzone.net 2001-2012