PDA

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 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

Begin2Fly
07-06-2021, 20:39
Serg866, как вариант: оставьте старый файл для совместимости и введите с последним обновлением ещё один, внеся соответствующие изменения в программу.

iglezz
07-06-2021, 21:00
как файл после подмены вновь заменится на новый? Это надо пояснять юзерам. С таким костылем может получиться так, что будет старый файл, а версия программы - новая. И наоборот »
Алгоритм навскидку такой: костыль подменяет новый файл на старый и показывает диалог с текстом вроде "сейчас можно поставить все нужные дополнения, по окончании нажать кнопку _дальше_" и кнопкой _дальше_, по нажатию которой будет произведена обратная замена. Всё это, конечно, нужно будет обильно обмазать проверками...

Serg866
07-06-2021, 22:24
Begin2Fly, не получится, так как старый файл должен быть заменен на новый под тем же именем.

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

Serg866
08-06-2021, 20:52
Ничего не придумал, костыль может ухудшить ситуацию при ошибке пользователя, поэтому тоже не вариант.

Kopejkin
09-06-2021, 10:02
А каков размер этих дополнений? При нынешнем интернете гигабайт туда, гигабайт сюда - роли не играет. Объявляете своим преданным пользователям о глобальном апдейте, все (или не все, если нужно) актуальные дополнения пихаете в один новый инсталлятор без проверок контрольной суммы основного исполняемого файла. Проверки наличия файла с названием вашей программы будет вполне достаточно.
Function .onVerifyInstDir
IfFileExists "$INSTDIR\имя-моей-программы.exe" PathGood
Abort
PathGood:
FunctionEnd
Или ваши дополнения могут работать с любым исполняемым файлом? Уверен, что нет! Я просто не могу въехать, зачем проверять контрольную сумму главного исполняемого файла, если все выпущенные до этого дополнения работают с любой версией этого файла?

Serg866
10-06-2021, 05:06
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.

iglezz
18-07-2021, 23:25
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)

iglezz
19-07-2021, 21:50
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\ и окно деинсталляции отобразилось.

MKN
02-10-2021, 09:46
Обновил 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 - всё ок

iglezz
03-10-2021, 17:33
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

iglezz
18-01-2022, 17:59
Сырок Дружба,
Косяк, в самом проблемном контроле 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, понял, принял, пощупал, работает. Благодарю за помощь.
Можно вопрос в образовательных целях.
Смысл удаления/комментирования указанных вами строк?
Я так полагаю просто для того что бы не было обращения к багнутому контролу; или там повторное использование переменных?
Буду признателен за разъяснение.

iglezz
19-01-2022, 15:38
Сырок Дружба,
Комментировать/удалять те строчки надо из-за конфликта с этими же дефайнами в nsDialogs.nsh.

Сырок Дружба
20-01-2022, 10:36
iglezz, понял, принял. Ещё раз благодарю за помощь.

S60Team
03-02-2022, 11:12
Доброго времени суток! Недавно задался вопросом, как определить 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