Условная установка с 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
Другие вопросы по тегам