【问题标题】:How to include two custom pages in NSIS?如何在 NSIS 中包含两个自定义页面?
【发布时间】:2012-12-08 17:28:34
【问题描述】:

我使用 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 之前给出显示函数,它会抛出运行时异常。因为在 Remove 函数内部还有一个 show()。

我的要求是,

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

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

谁能帮帮我?

谢谢。

【问题讨论】:

  • 为什么删掉老问题,基本上又问同样的问题?
  • 这个问题不太清楚。这就是我发布这个的原因
  • 如果您发布人们可以编译的代码会更清楚,在这种情况下,这至少意味着页面说明......

标签: nsis


【解决方案1】:

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

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

您的 Remove 函数应该检查我们刚刚创建的标志:

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

【讨论】:

  • 谢谢@Francisco。我也这么认为。但我不能实现。因为我不能从头文件调用nsDialogpage。我已经从另一个函数调用(见代码:nsDialogpage)。所以我不能像这样调用页面自定义nsDialogpage Mycustompage。给任何想法?
  • check函数的FunctionEnd在哪里?
  • 对不起,我忘记关闭那个了。现在我已经包含了所有代码。
  • 谢谢。工作正常。但是如果用户选择修复选项,那么时间也会控制到“页面自定义删除”并检查条件。我认为这没有必要。如何避免这种情况?跨度>
  • 使用 Abort 来避免显示第二页。例如,在您的 Remove 函数中,您可以这样做:`${If} $RemoveRequested == "0" Abort ${EndIf}"
【解决方案2】:

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

【讨论】:

  • 您能详细说明一下吗?或者我可以在上面的源代码中在哪里添加你的两行代码?
  • 只有一行,你应该已经有一部分了:"Page custom nsDialogpage"
  • 安德斯我已经添加了关于修复和删除的代码流。有什么解决办法吗?
猜你喜欢
  • 2023-04-06
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
相关资源
最近更新 更多