2012-07-31 102 views
0

我有一个NSIS安装程序调用卸载程序自动卸载程序的旧版本。 http://nsis.sourceforge.net/Auto-uninstall_old_before_installing_newNSIS卸载并同时安装活动

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

有什么办法来强制安装在卸载程序处于活动状态的后台中?

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

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

我一直禁止在卸载程序中的“关闭”按钮来代替。我认为这一部分仍然在安装...

回答

1

我不明白如何可以通过.onInit显示用户可以点击任何UI,因为主窗口还没有创建,但如果你将代码移到其他可以隐藏/显示安装程序的地址为HideWindow + BringToFront(基本上为ShowWindow$HWNDPARENT 0|1),或者禁用用户不想让用户点击的按钮,其中GetDlgItem + EnableWindow

+0

我想试试这个,但我不知道我是否可以调用从卸载安装窗口(因为这是我需要当我开始时隐藏 - 当用户取消或卸载成功时显示)。我宁愿禁用“安装”按钮,所以我想...编辑自己的帖子。 – Thalia 2012-07-31 20:05:33

+1

你可以使用ExecWait和_?语法等待卸载,然后重新启用,卸载程序应不能触及的安装程序UI。 – Anders 2012-07-31 20:18:58

+0

谢谢,这正是我没有做,从代码我不明白是什么意思的评论,它是完美的。 – Thalia 2012-07-31 20:28:20

1

根据您链接到的代码段我认为你不必担心。

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

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

因为所有这一切都在.onInit功能完成后,用户没有机会在老版本卸载之前与新版本进行交互。

他们可以卸载旧版本之前,安装新版本的唯一方法是,如果他们点击时,消息框出现取消。如果你想删除这个选项,那么你可以改变的MessageBox代码太:

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

您还需要去掉IDOK uninstAbort线在MessageBox指令之后。

希望这会有所帮助。

脚本的基本格式应该是:

Function .onInit 
    code you linked to goes here 
FunctionEnd 

Section "Install" 
    install stuff goes here 
SectionEnd 

Section "Uninstall" 
    Uninstall stuff goes here 
SectionEnd 
+1

我只是写了一个小的测试脚本,似乎工作,我会想到我。确保你在.onInit函数中的原始问题中链接了代码。编辑我的答案,试图说清楚。 – RyanE 2012-07-31 20:03:00

+0

我的代码与链接相同,除了“_?= $ INSTDIR”;不要将卸载程序复制到临时文件“ – Thalia 2012-07-31 20:08:05

+0

没有看到您的代码,我无法真正帮助您超越我已经发布。链接中的代码完全适合我。弹出消息框,安装程序窗口甚至不会出现,直到我选择了ok并且卸载程序完成运行。 – RyanE 2012-07-31 20:14:21