【问题标题】:NSIS uninstall and install active at the same timeNSIS 卸载和安装同时激活
【发布时间】:2012-07-28 17:21:23
【问题描述】:

我有一个 NSIS 安装程序,它调用卸载程序来自动卸载旧版本的程序。 http://nsis.sourceforge.net/Auto-uninstall_old_before_installing_new

不幸的是,用户有可能点击安装,并在运行卸载之前运行安装程序,然后继续卸载...

有没有办法在卸载活动时强制安装程序在后台运行?

编辑:试图禁用“安装”按钮,

  ClearErrors
  ;disable the Install button
  GetDlgItem $R1 $HWNDPARENT 0
  EnableWindow $R1 0
  ...
done:
  ;disable the Install button
  GetDlgItem $R1 $HWNDPARENT 0
  EnableWindow $R1 0

我一直禁用卸载程序上的“关闭”按钮。我以为这部分还在安装程序中...

【问题讨论】:

    标签: nsis uninstallation


    【解决方案1】:

    我看不到 .onInit 显示的用户可以点击的任何 UI,因为尚未创建主窗口,但如果您将代码移到其他地方,您可以使用 @ 隐藏/显示安装程序987654323@+BringToFront(基本上是ShowWindow$HWNDPARENT 0|1)或使用GetDlgItem+EnableWindow禁用您不希望用户点击的按钮。

    【讨论】:

    • 我想试试这个,但我不知道我是否可以从卸载中调用安装窗口(因为这是我需要做的 - 在我开始时隐藏,并在任何时候显示用户取消或卸载成功)。我更喜欢禁用“安装”按钮,所以我正在尝试...编辑我的帖子。
    • 您会将 ExecWait 与 _?等待卸载程序然后重新启用的语法,卸载程序不应触摸安装程序 UI。
    • 谢谢,这正是我没有做的,从对代码的评论我没明白这是什么意思,它是完美的。
    【解决方案2】:

    根据你链接的代码sn-p,我认为你不必担心。

    .onInit 函数在安装程序 UI 绘制到屏幕上之前执行,因此卸载程序将在用户甚至有机会与安装程序交互之前运行。

    只是为了确保您正确理解该代码在做什么,当您运行新安装程序时,它会在注册表中查找旧版本的卸载程序可执行文件的位置,然后弹出一个消息框询问您是否想卸载以前的版本。如果单击确定,它将使用 ExecWait 指令执行卸载程序,这将阻止执行下一条指令,直到卸载程序返回(完成)。如果用户点击取消,则会跳过旧版本的卸载。

    因为这一切都是在 .onInit 函数中完成的,所以在旧版本卸载之前,用户没有机会与新版本进行交互。

    他们可以在卸载旧版本之前安装新版本的唯一方法是在消息框出现时单击取消。如果您想删除此选项,那么您也可以更改 MessageBox 代码:

    MessageBox MB_OK|MB_ICONEXCLAMATION \
          "${PROGRAM_NAME} is already installed. $\n$\nClick `OK` to remove the \
           previous version"
    

    您还需要删除 MessageBox 指令后面的 IDOK uninstAbort 行。

    希望这会有所帮助。

    脚本的基本格式应该是:

    Function .onInit
        code you linked to goes here
    FunctionEnd
    
    Section "Install"
        install stuff goes here
    SectionEnd
    
    Section "Uninstall"
        Uninstall stuff goes here
    SectionEnd   
    

    【讨论】:

    • 我刚刚编写了一个小测试脚本,它似乎可以按我的预期工作。确保您拥有在 .onInit 函数内的原始问题中链接到的代码。编辑了我的答案以试图说明这一点。
    • 我拥有的代码与链接相同,除了 "_?=$INSTDIR' ;不要将卸载程序复制到临时文件"
    • 好吧,如果没有看到您的代码,除了我已经发布的内容之外,我真的无法为您提供太多帮助。链接中的代码非常适合我。弹出消息框,安装程序窗口甚至不会出现,直到我选择了确定并且卸载程序完成运行。
    【解决方案3】:

    调用卸载程序如下。
    ExecWait '"$INSTDIR\Uninstall.exe" _?=$INSTDIR'
    然后使用 BringToFront
    它将隐藏安装程序,直到卸载程序存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 2022-10-12
      • 2018-09-06
      • 1970-01-01
      • 2012-01-26
      相关资源
      最近更新 更多