1

我使用 NSIS 脚本创建了 EXE 文件。我使用以下代码创建了自定义页面,

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

如果我运行上面的代码它不起作用。在显示函数之后没有执行代码。如果我在 functionEnd 之前给出显示函数它会抛出运行时异常。因为在删除函数内部还有一个 show()。

我的要求是,

如果用户单击删除单选按钮,则转到下一页并执行卸载过程,页面结束。我已经使用上面的代码尝试了这种情况。但它工作正常。

如何在 nsis 安装程序中包含两个自定义页面?

谁能帮我?

谢谢。

4

2 回答 2

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
于 2012-12-05T10:04:34.293 回答
0

nsDialogs::Show页面基本没有了之后,在 leave 回调中做你的工作:Page custom nsDialogpage dotheradiocheckinthisfunction

于 2012-12-01T19:03:12.710 回答