NSIS同时卸载并安装活动

时间:2012-07-31 00:54:17

标签: nsis uninstall

我有一个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

我继续禁用卸载程序上的“关闭”按钮。我认为这部分仍在安装程序中......

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

根据您链接的代码段,我认为您无需担心。

.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   

答案 2 :(得分:0)

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