Показать полную графическую версию : [архив].: NSIS - все вопросы :.
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 в данном случае »
последовательность, уважаемый забыли и прыжок,
если не нужно прерывание, примеры выше
Добрый день. Есть вопрос по программе 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 не перепрыгнуть.
kotkovets
Спасибо за отклик!
В таком случае страничка выбора директории неуместна.
на примере 7-zip девятой версии »
Нет. Уместна. Мне нужна проверка именно в таком виде, как я описал.
Именно, чтобы пользователь указывал каталог для установки и нажимал "Далее".
Если он указал его неправильно - должно всплыть сообщение о неправильном каталоге.
А Вы мне привели пример выполнения функции проверки при "закрытии страницы с компонентами".
При этом у Вас в примере путь проверяемого файла берётся из реестра или из папки Program Files. Про реестр я написал отдельно, не факт что ключ есть в рестре. А Program Files мне вообще никак тут не нужна. Игра у пользователя может быть установлена где угодно вообще. Именно поэтому мне необходимо, чтобы пользователь САМ указывал папку для установки и нажимал "Далее". И после этого шла бы проверка. Ничего другое мне не подходит.
На офф. сайте найдите плагин MD5 и сверьте хэш-сумму оригинала, если не сходится прерывание. »
Это уже, к сожалению, за гранью моего понимания (
____________________________________________
Имеется к Вам предложение.
Наш проект высочайшей технической сложности.
Это обширное дополнение для игры. Требует высококачественного инсталлятора. Основы я знаю, проблемы лишь вот с такими доп.функциями, как проверки.
Мы уже много лет занимаемся выпуском комплексных патчей и у нас тысячи пользователей, ждущих релиза. Дабы не заниматься рекламой - умышленно не называю имя проекта.
Для создания инсталляторов у нас был отдельный человек, который создавал прекрасные инсталлы на основе Ghost Installer. В этом году он отошёл от дел и инсталлер вынужден делать я. Как Вы понимаете, должно быть не хуже чем было. Не хуже ни по функционалу, ни по оформлению. Так вот, если вы понимаете что именно я хочу реализовать по поводу проверок, могу ли я рассчитывать на Вашу ПРЯМУЮ помощь? Т.е Вы, по возможности подготовите уже готовые коды для необходимых нам функций. Если Вы согласны поучаствовать напрямую в создании инсталлятора - мы могли бы связаться с вами по ICQ, я бы вам поведал об обширности проекта и всей серьёзности дела.
Проект некоммерческий и денег, к сожалению, я вам предложить не могу.
Но обещаю Вам персональную благодарность в списке авторов, а также по Вашему желанию указать ссылку на Ваш ресурс или какие-либо другие координаты.
Вы также можете привлечь Ваших коллег по данному ремеслу.
Будем рады сотрудничеству.
Жду Вашего решения.
wolkow70
21-11-2011, 17:31
Если я столь грубо выразился, то приношу извинения... »Только извинений недостаточно. В таких случаях принято и сообщение поправить. Ведь, сюда люди иногда заходят почитать.
Только извинений недостаточно. »
Ты тоже деликатностью не блещишь : :)
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
Сейчас хочу что-нибудь поинтереснее сделать.
Обновился 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC