Как включить две пользовательских страницы в NSIS?

Я создал EXE-файл, используя скрипт NSIS. Я создал пользовательскую страницу, используя следующий код,

page custom check

Function check
    ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My app" "UninstallString"
    IfFileExists $R0 +1 NotInstalled
        call nsDialogpage

    NotInstalled:
FunctionEnd

Function nsDialogpage
     nsDialogs::Create 1018
     Pop $Dialog12
     ${If} $Dialog12 == error
         Abort
     ${EndIf}
     ${NSD_CreateRadioButton} 0 5u 100% 10u "Repair"
     Pop $Repair
     ${NSD_CreateRadioButton} 0 25u 100% 56u "Remove"
     Pop $Remove
     ${NSD_SetState} $Repair ${BST_CHECKED}
     ${NSD_GetState} $Repair $test
     --Do repair operation--
     ${NSD_OnClick} $Remove "Remove"
     nsDialogs::Show
     ${NSD_GetState} $Remove $RadioButton_State
     ${If} $RadioButton_State == ${BST_CHECKED}
         call Removed
     ${Else}
         Goto Done
     ${EndIf}
     Done:
FunctionEnd    

Function Remove
     nsDialogs::Create 1018
     Pop $Dialog12
     ${If} $Dialog12 == error
           Abort
     ${EndIf}
        --Do remove function--
      /* nsDialogs::Show*/
 FunctionEnd

Если я запускаю приведенный выше код, он не работает. Никакой код не выполняется после функции show. Если я даю функцию show перед функцией, и она выдает мне исключение времени выполнения. Потому что внутри функции Remove также есть еще одна функция show().

Мое требование

Если пользователь нажимает переключатель "Удалить", переходит на следующую страницу и выполняет процесс удаления, и страница заканчивается. Я пробовал этот сценарий с использованием приведенного выше кода. Но он работает нормально.

Как включить две пользовательских страницы в установщик nsis?

Может кто-нибудь мне помочь?

Благодарю.

2 ответа

Решение

Вы можете добавить две пользовательские страницы точно так же, как вы добавляете пользовательскую страницу:

Page custom check 
Page custom Remove

Как сказал Андерс, все, что вы ставите после nsDialogs::Show не выполняется Вам нужно переместить этот код в новую функцию "выхода":

Var RemoveRequested
Function RemoveCheck
    ${NSD_GetState} $Remove $RadioButton_State
    ${If} $RadioButton_State == ${BST_CHECKED}
        StrCpy $RemoveRequested "1"
    ${Else}
        StrCpy $RemoveRequested "0"
    ${EndIf}
FunctioEnd

Вы сохраняете выбор пользователя в глобальной переменной $RemoveRequested, Затем на следующей пользовательской странице вы можете проверить эту переменную и сделать все, что вам нужно, или просто Abort и вторая страница не будет отображаться.

А затем вам нужно изменить объявление пользовательских страниц:

Page custom check RemoveCheck
Page custom Remove

Сейчас, check будет использоваться для показа пользовательской страницы, а когда пользователь покидает страницу (== нажимает "Далее"), функция RemoveCheck будет выполнен.

Ваша функция Remove должна проверять флаг, который мы только что создали:

Function Remove
    ${If} $RemoveRequested == "1"
        nsDialogs::Create 1018
        Pop $Dialog12
        ${If} $Dialog12 == error
            Abort
        ${EndIf}
        --Do remove function--
        /* nsDialogs::Show*/
    ${EndIf}
FunctionEnd

После nsDialogs::Show страница в основном исчезла, сделайте свою работу в обратном вызове Page custom nsDialogpage dotheradiocheckinthisfunction

Другие вопросы по тегам