我有一个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
我继续禁用卸载程序上的“关闭”按钮。我认为这部分仍在安装程序中......
答案 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 uninst
和Abort
行。
希望这有帮助。
脚本的基本格式应为:
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
它将隐藏安装程序,直到存在卸载程序为止。