如何在NSIS中包含两个自定义页面?

时间:2012-12-01 15:06:20

标签: nsis

我使用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

如果我运行上面的代码它不能正常工作。没有代码在show function之后执行。如果我在functionEnd之前给出show函数它会抛出运行时异常。因为在Remove函数里面还有一个show()。

我的要求是,

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

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

任何人都可以帮助我吗?

感谢。

2 个答案:

答案 0 :(得分:2)

您可以像添加自定义页面一样添加两个自定义页面:

Page custom check 
Page custom Remove

正如 Anders 所说,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

你的删除功能应该检查我们刚创建的标志:

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

答案 1 :(得分:0)

nsDialogs::Show页面基本消失后,请在留言回调中完成工作:Page custom nsDialogpage dotheradiocheckinthisfunction