0

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

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

4

3 回答 3

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   
于 2012-07-31T14:00:41.627 回答
1

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

于 2012-07-31T01:17:32.077 回答
0

如下调用卸载程序。
ExecWait '"$INSTDIR\Uninstall.exe" _?=$INSTDIR'
然后使用BringToFront
会隐藏 Installer 直到 Uninstaller 存在。

于 2019-01-31T06:05:12.653 回答