2024年3月31日发(作者:)

在后面的内容中,主要解答以下几个经常有朋友问到,却又往往得不到很好的解决的问题:

如何创建卸载快捷方式?

为什么卸载的时候不执行 OnMaintUIBefore 和 OnMaintUIAfter?

为什么卸载的时候不执行 OnUnInstall?

为什么卸载的时候并没有调用 OnMaintUIBeforeXXXX 或者 OnUnInstall,甚至连 OnBegin、OnAppSearch、

OnShowUI 等等事件处理函数都没有调用?

为什么第二次运行安装程序的时候毫无提示就卸载了以前的版本并没有调用 OnMaintUIBeforeXXXX 或者

OnUnInstall?

--------------------------------------------------------------------------------

关于如何创建卸载快捷方式的问题,请参考:〈InstallShield: Creating Uninstallation Shortcut 创

建卸载快捷方式〉一文

请记住那个表格。在脚本中创建卸载快捷方式最好的方法就是用用于定义常量 UNINSTALL_STRING 提供的

值。而在 IS 操作界面中创建卸载快捷方式最好参考帮助中(参考该文)表格的方法,根据不同的项目类

型采用不同的方法。如果用 IS 提供的方便功能创建的卸载快捷方式有些毛病,最好改改——至于原因,

在后面会提到。

--------------------------------------------------------------------------------

为什么卸载的时候不执行 OnMaintUIBefore 和 OnMaintUIAfter?

为什么卸载的时候不执行 OnUnInstall ?

在 General Information -> Project Properties 你能看到:Enable Maintenance 这一选项。如果设置

为 Yes,那么当用户在一台已经安装了该软件的计算机上再次运行安装程序,则会自动运行

OnMaintUIBefore 和 OnMaintUIAfter 事件处理函数中的脚本。如果设置为 No,那就会调用 UnInstall 事

件处理函数的脚本。

那么,如果卸载的时候不执行这两个事件处理函数的脚本,就要检查一下这一设置了。

但(呵呵,这里有个“但”),卸载的时候也可能不运行这两个函数以及 OnUnInstall,耐心看下去吧。

--------------------------------------------------------------------------------

为什么卸载的时候并没有调用 OnMaintUIBeforeXXXX 或者 OnUnInstall,甚至连 OnBegin、OnAppSearch、

OnShowUI 等等事件处理函数都没有调用?

1、安装程序如果运行在“安静”模式下,则不会执行这些事件处理脚本。

比如 /s 或者 /M{Product Code} /uninst 这样的调用 (请参考:〈InstallShield:

Creating Uninstallation Shortcut 创建卸载快捷方式〉一文)。

2、如果不是在“安静模式”,用户在控制面板的 添加删除程序 中,直接点了列在程序项后面的“删除”

而不是“更改”,则会运行在 REMOVEONLY 模式下。此时不出现维护界面,但并不是没有执行相应脚本。

假如 Enable Maintenance 的设置为 Yes,按照上面的说法,显然应该执行 OnMaintUIBefore 事件处理函

数的脚本,但因为其默认代码如图:

所以不会调用 SdWelcomeMaint ,也就不会出现维护界面。所以容易错以为 OnMaintUIBefore 没有效果。

我们来看看“添加删除程序”的按钮和设置的关系:

其设置结果如图: