Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Begin2Fly
07-06-2021, 20:39
Serg866, как вариант: оставьте старый файл для совместимости и введите с последним обновлением ещё один, внеся соответствующие изменения в программу.
как файл после подмены вновь заменится на новый? Это надо пояснять юзерам. С таким костылем может получиться так, что будет старый файл, а версия программы - новая. И наоборот »
Алгоритм навскидку такой: костыль подменяет новый файл на старый и показывает диалог с текстом вроде "сейчас можно поставить все нужные дополнения, по окончании нажать кнопку _дальше_" и кнопкой _дальше_, по нажатию которой будет произведена обратная замена. Всё это, конечно, нужно будет обильно обмазать проверками...
Begin2Fly, не получится, так как старый файл должен быть заменен на новый под тем же именем.
iglezz, у меня инсталлеры программы и дополнений построены таким образом, что исключены варианты, при которых юзер может произвести установку неправильно. В случае с костылем, такие варианты появляются - не нажмет кнопку 'дальше', закроет костыль раньше времени. Пока не вижу таких проверок, которые могли бы исключить ошибку со стороны юзера при взаимодействии с костылем. Но, будем думать)
Ничего не придумал, костыль может ухудшить ситуацию при ошибке пользователя, поэтому тоже не вариант.
Kopejkin
09-06-2021, 10:02
А каков размер этих дополнений? При нынешнем интернете гигабайт туда, гигабайт сюда - роли не играет. Объявляете своим преданным пользователям о глобальном апдейте, все (или не все, если нужно) актуальные дополнения пихаете в один новый инсталлятор без проверок контрольной суммы основного исполняемого файла. Проверки наличия файла с названием вашей программы будет вполне достаточно.
Function .onVerifyInstDir
IfFileExists "$INSTDIR\имя-моей-программы.exe" PathGood
Abort
PathGood:
FunctionEnd
Или ваши дополнения могут работать с любым исполняемым файлом? Уверен, что нет! Я просто не могу въехать, зачем проверять контрольную сумму главного исполняемого файла, если все выпущенные до этого дополнения работают с любой версией этого файла?
Kopejkin, главный исполняемый файл (ехе инсталлятора) никак не проверяется. Речь о проверочном файле, с которого считывают хеш-сумму инсталлятоы дополнений. В новой версии программы проверочный файл заменяется, соответственно дополнения не установятся поверх новой версии программы, ибо файл будет с другой хеш-суммой. Ищу вариант как сделать так, чтобы устанавливались, так как технически и с новым файлом дополнения совместимы.
Kopejkin
10-06-2021, 21:53
Так я ж предложил...
Объявляете своим преданным пользователям о глобальном апдейте, все (или не все, если нужно) актуальные дополнения пихаете в один новый инсталлятор без проверок контрольной суммы ... файла. »
А дальше ваши пользователи смогут спокойно пользоваться этим комплектом дополнений для работы с любым будущим обновлением основной программы.
Чаще всего, простое решение лучше сложного.
P.S. можно ссылку на софт. Или это что-то слишком специализированное? Если не для "хомячков", тем более такое решение не вызовет проблем.
Adjective
18-07-2021, 01:32
Всем привет!
Подскажите пожалуйста, что не так с кодом удаления ранее установленной версии программы в оригинальном файле "makensis.nsi" находящемся по пути: (..\NSIS\Examples\makensis.nsi)?
Судя по коду предоставленном на официальном сайте (https://nsis.sourceforge.io/Auto-uninstall_old_before_installing_new) данный код "как я понял" он работает по поиску идентификатора, а в "makensis.nsi" он работает по версии записанной в реестре. Здесь на форуме нашел ещё один вариант (по поиску указанного файла) с функцией .onInit:
Exec $INSTDIR\uninst-nsis.exe
Но это не то, хоть и работает ЕСЛИ файл ИМЕННО с таким именем существует и расположен ИМЕННО по пути по умолчанию. В "makensis.nsi" более правильный вариант определения установленной программы (на мой взгляд), но не работает.
Сам "makensis.nsi" наверное нет смысла выкладывать, так как он идет по умолчанию в директории nsis.
Adjective, Подскажите пожалуйста, что не так с кодом удаления ранее установленной версии программы в оригинальном файле "makensis.nsi"
А что именно с ним не так и что именно там не работает?
И в makensis.nsi, и в вышеуказанном "Auto-uninstall old before installing new" используется абсолютно одинаковый метод обнаружения установленной программы (считывание ключа UninstallString в ..\CurrentVersion\Uninstall\..). Вариант в makensis.nsi не стоит считать более правильным, т.к. во втором случае (auto-uninstall) считывание версии просто не требуется (хотя это можно применить, например, при записи журнала установки).
В makensis.nsi, как и в вышеуказанном "Auto-uninstall old before installing new" используется похожий метод обнаружения установленной программы -- считывание ключа UninstallString в ..\CurrentVersion\Uninstall\... Только что дополнительно читается HKLM\Software\NSIS\@, а затем проверяется версия для реализации разных сценариев (Add/Reinstall - Uninstall - Do not uninstall)
Вариант в makensis.nsi не стоит считать более правильным, т.к. во втором случае (auto-uninstall) считывание версии просто не требуется (хотя это можно применить, например, при записи журнала установки).
Вариант с Exec $INSTDIR\uninst-nsis.exe, очевидно, рассчитан на использование атрибута InstallDirRegKey или установку по жёстко заданному пути.
Adjective
19-07-2021, 06:22
А что именно с ним не так и что именно там не работает? »
Спасибо за отзыв iglezz.
Не работает код определения ранее установленной версии (программы).
Ссылка (https://www.upload.ee/files/13323872/file.7z.html)
Adjective,
Работает, если правильно собрать. Для текущего релиза это будет команда (текущий путь - ${__FILEDIR__} (https://nsis.sourceforge.io/Docs/Chapter5.html#prefiledir)):..\makensis.exe /DVERSION=3.06.1 /DVER_MAJOR=3 /DVER_MINOR=6 /DVER_REVISION=1 /DVER_BUILD=0 makensis.nsi
По умолчанию всё это добро не определено и кастомная страница с определением версии просто не включается в установщик:!ifdef VER_MAJOR & VER_MINOR & VER_REVISION & VER_BUILD
Page custom PageReinstall PageLeaveReinstall
!endif
Adjective
20-07-2021, 10:45
iglezz,
Спасибо, получилось выполнить сборку через командную строку:
..\makensis.exe /DVERSION=3.06.1 /DVER_MAJOR=3 /DVER_MINOR=6 /DVER_REVISION=1 /DVER_BUILD=0 makensis.nsi
выполнив её непосредственно из папки ..\NSIS\Examples\ и окно деинсталляции отобразилось.
Обновил NSIS до 3.08.
Сразу же появилась ошибка при компиляции, связанная с DelRegKey.nsh :
!include: error in script: "C:\Program Files\NSIS\Include\DelRegKey.nsh" on line 4
(на 4 строке : !verbose 3)
а также ругань на соотв. строку в скрипте, где - !include "DelRegKey.nsh"
Как бы это исправить ?
ps откатился на v 3.06.1 - всё ок
MKN, возможно дело в неверно распознанной компилятором кодировки DelRegKey.nsh
По крайней мере у меня 3.08 и 3.06.1 считали этот файл как UTF8!include: "C:\PortableApps\NSIS308\Include\DelRegKey.nsh" (UTF8)
Bad text encoding: C:\PortableApps\NSIS308\Include\DelRegKey.nsh:4
!include: error in script: "C:\PortableApps\NSIS308\Include\DelRegKey.nsh" on line 4
Error in script "C:\PortableApps\NSIS308\Examples\example1DRK.nsi" on line 27 -- aborting creation process
Это лечится явным указанием кодировки включаемого файла!include /charset=cp1251 delregkey.nsh
Сырок Дружба
18-01-2022, 16:21
Доброго времени суток, товарищи знатоки. Есть вопрос. При переходе с кастомной страницы nsDialog-а на стандартную страницу MUI выбора директории футер ломается в шрифтах и масштабировании. При возврате к предыдущей странице ломается и она. Собственно вопрос - в чем косяк? Что, где, когда искать и чего почитать? Код и скриншоты прилагаю.
!include nsDialogs.nsh
!include LogicLib.nsh
!include MUI2.nsh
!include WinMessages.nsh
!define INSTALL_TYPE "SetShellVarContext all"
Name "Тестовая программа"
OutFile SoftSetup.exe
RequestExecutionLevel admin
ShowInstDetails show
InstallDir "$PROGRAMFILES\Soft"
Var Dialog
Var CheckSoft
Var CheckServer
Var CheckClient
Var CheckSoftSelect
Var CheckServerSelect
Var CheckClientSelect
Var BoxIP
Var EnterServerIP
Var ServerIP
!insertmacro MUI_PAGE_WELCOME
Page custom alPageCreate alPageLeave
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
Function alPageCreate
!insertmacro MUI_HEADER_TEXT "Настройки установки " "Выберете необходимые компоненты для установки"
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
${NSD_CreateGroupBox} 10% 5u 80% 65u "Компоненты для установки "
Pop $0
${NSD_CreateCheckBox} 15% 20u 40% 10u "Установка компонента 1"
Pop $CheckSoft
${NSD_CreateCheckBox} 15% 35u 40% 10u "Установка компонента 2"
Pop $CheckServer
${NSD_CreateCheckBox} 15% 50u 40% 10u "Установка компонента 3"
Pop $CheckClient
${NSD_OnClick} $CheckClient ServerIpDialog
${NSD_CreateGroupBox} 10% 75u 80% 40u "IP адрес базы данных"
Pop $BoxIP
ShowWindow $BoxIP ${SW_HIDE}
${NSD_CreateIPAddress} 15% 90u 55% 14u $EnterServerIP
Pop $EnterServerIP
ShowWindow $EnterServerIP ${SW_HIDE}
nsDialogs::Show
FunctionEnd
Function ServerIpDialog
Pop $CheckClient
Pop $BoxIP
${NSD_GetState} $CheckClient $0
${If} $0 == 1
ShowWindow $EnterServerIP ${SW_SHOW}
ShowWindow $BoxIP ${SW_SHOW}
${Else}
ShowWindow $EnterServerIP ${SW_HIDE}
ShowWindow $BoxIP ${SW_HIDE}
${EndIf}
FunctionEnd
Section ""
DetailPrint "Hello, World!"
SectionEnd
Сырок Дружба,
Косяк, в самом проблемном контроле SysIPAddress32.
Обходное решение (которое почему то не вошло в состав nsDialogs.nsh): https://nsis.sourceforge.io/NsDialogs_CreateIPaddress
В nsDialogs_createIPaddress.nsh необходимо будет закомментировать или удалить строки !define __NSD_IPaddress_CLASS SysIPAddress32
!define __NSD_IPaddress_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}
!define __NSD_IPaddress_EXSTYLE 0
!insertmacro __NSD_DefineControl IPaddress
Сырок Дружба
19-01-2022, 10:33
iglezz, понял, принял, пощупал, работает. Благодарю за помощь.
Можно вопрос в образовательных целях.
Смысл удаления/комментирования указанных вами строк?
Я так полагаю просто для того что бы не было обращения к багнутому контролу; или там повторное использование переменных?
Буду признателен за разъяснение.
Сырок Дружба,
Комментировать/удалять те строчки надо из-за конфликта с этими же дефайнами в nsDialogs.nsh.
Сырок Дружба
20-01-2022, 10:36
iglezz, понял, принял. Ещё раз благодарю за помощь.
Доброго времени суток! Недавно задался вопросом, как определить Windows 11 в NSIS:
Начиная с ранней сборки "утекшей в сеть", в C:\Windows\System32 появился файл ntkrla57.exe.
Так что сначала определяю, есть ли ключ в реестре только для 10ки,
А потом проверяю, внимание! Не присутствие файла ntkrla57.exe, а его версию:
ClearErrors
ReadRegDWORD $R9 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "CurrentMajorVersionNumber"
IfErrors 0 Win_X
StrCpy $R8 "8.1 or Server 2012 R2"
Goto Win_End
Win_X:
ClearErrors
GetDLLVersion "C:\Windows\System32\ntkrla57.exe" $R0 $R1
IfErrors 0 Win_11
StrCpy $R8 "10 or Server 2016 - 2019"
Goto Win_End
Win_11:
StrCpy $R8 "11 or Server 2022"
Win_End:
ClearErrors
ClearErrors
ReadRegDWORD $R9 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "CurrentMajorVersionNumber"
; Если записи в реестре нет, то это 8.1:
${If} ${Errors}
StrCpy $R8 "8.1 or Server 2012 R2"
; А Если есть (10), то это 10 или 11:
${Else}
ClearErrors
GetDLLVersion "C:\Windows\System32\ntkrla57.exe" $R0 $R1
${If} ${Errors}
StrCpy $R8 "10 or Server 2016 - 2019"
${Else}
StrCpy $R8 "11 or Server 2022"
${EndIf}
${EndIf}
ClearErrors
Всё работает отлично!
ЗЫ: Пробовал проверять присутствие файла - не работает. Через WMI - нужно получить строку, потом определить, есть ли в строке "11"...
В общем, простыня кода.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC