Условная установка с NSIS
Мне нужно сделать установщик, который также будет действовать как программа восстановления / удаления, если соответствующее программное обеспечение уже установлено.
Мне удалось создать пользовательскую страницу, которая проверяет, существует ли программа, и отображает кнопки в зависимости от этого (создание ключа реестра только для целей тестирования и должно быть включено в процесс установки).
Например, кнопка "Установить" появляется, если программа не установлена.
Вот код, делающий это:
Page Custom MyCustomPage
var button
var buttonRepair
var buttonUninstall
var dialog
Function MyCustomPage
ReadRegStr $R0 HKLM ${P_DIR_REGKEY} "Version"
${If} ${Errors}
Goto NotInstalled
${Else}
Goto Installed
${EndIf}
NotInstalled:
nsDialogs::Create 1018
;Pop $dialog
${NSD_CreateButton} 25% 25% 50% 50% "Install"
Pop $button
EnableWindow $button 1 # start out disabled
WriteRegStr HKLM ${P_DIR_REGKEY} "Version" ${P_VERSION}
WriteRegStr HKLM ${P_DIR_REGKEY} "" "$INSTDIR\asd.exe"
nsDialogs::Show
${NSD_OnClick} $button ManageInstall
Goto MyEnd
Installed:
nsDialogs::Create 1018
Pop $0
${NSD_CreateButton} 12% 12% 25% 25% "Repair"
Pop $buttonRepair
${NSD_CreateButton} 37% 12% 25% 25% "Uninstall"
Pop $buttonUninstall
EnableWindow $button 1 # start out disabled
EnableWindow $button2 1
${NSD_OnClick} $buttonRepair ManageRepair
${NSD_OnClick} $buttonUninstall ManageUninstall
nsDialogs::Show
Goto MyEnd
MyEnd:
Quit
FunctionEnd
Function ManageInstall
MessageBox MB_OK "Installation"
FunctionEnd
Function ManageRepair
MessageBox MB_OK "Repair"
FunctionEnd
Function ManageUninstall
MessageBox MB_OK "Uninstallation"
FunctionEnd
Проблема в том, что все это управляется функциями, и я не могу объявить новые макросы страниц в них, поэтому я не могу продолжать правильную установку через разделы из-за этого.
Как мне управлять различными действиями, которые должен выполнить установщик, чтобы сделать удобные для пользователя страницы, как при обычной установке?
Должен ли я использовать пользовательские страницы для каждого отдельного действия, потому что это звучит немного разборчиво и сложно?
1 ответ
Я рекомендую вам создать переменную с именем "ACTION" и установить ее значение, когда пользователь щелкает опцию. А затем перейдите на следующую страницу. Что-то вроде этого:
# http://nsis.sourceforge.net/Go_to_a_NSIS_page
Function RelGotoPage
IntCmp $R9 0 0 Move Move
StrCmp $R9 "X" 0 Move
StrCpy $R9 "120"
Move:
SendMessage $HWNDPARENT "0x408" "$R9" ""
FunctionEnd
Function GotoNextPage
StrCpy $R9 "1"
Call RelGotoPage
FunctionEnd
Function ManageRepair
StrCpy $ACTION "repair"
Call GotoNextPage
Abort
FunctionEnd
Затем в каждой функции "pre" необходимо проверить, должна ли она отображаться:
Function repairpage
# Do not display this page unless user selected Repair.
${if} "$ACTION" != "repair"
Abort
$[EndIf}
....
FunctionEnd