在后面的内容中,主要解答以下几个经常有朋友问到,却又往往得不到很好的解决的问题:
如何创建卸载快捷方式?
为什么卸载的时候不执行 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、安装程序如果运行在“安静”模式下,则不会执行这些事件处理脚本。
比如 setup.exe /s 或者 IDriver.exe /M{Product Code} /uninst 这样的调用 (请参考:〈InstallShield: Creating Uninstallation Shortcut 创建卸载快捷方式〉一文)。
2、如果不是在“安静模式”,用户在控制面板的 添加删除程序 中,直接点了列在程序项后面的“删除”而不是“更改”,则会运行在 REMOVEONLY 模式下。此时不出现维护界面,但并不是没有执行相应脚本。
假如 Enable Maintenance 的设置为 Yes,按照上面的说法,显然应该执行 OnMaintUIBefore 事件处理函数的脚本,但因为其默认代码如图:
所以不会调用 SdWelcomeMaint ,也就不会出现维护界面。所以容易错以为 OnMaintUIBefore 没有效果。 我们来看看“添加删除程序”的按钮和设置的关系:
其设置结果如图:
3、不同的方法创建的卸载快捷方式也可能导致卸载过程不执行任何脚本。
最近一次为 xzSQLDeploy 制作安装程序(请参考〈InstallShield Example: 演示 xzSQLDeploy 和 xzIISConfig 脚本的使用〉一文提供的 InstallShield X 制作的范例),我采用了 IS 提供的快捷功能来创建卸载快捷方式:在 Project Assistant 方式下的 Application Shortcuts 这一步执行左边的 Create an Unstallation Shortcut(请参考〈InstallShield: Creating Uninstallation Shortcut 创建卸载快捷方式〉一文) :
结果对比发现该快捷方式采用的是 MSIExec.exe 的 /x 参数来进行卸载——于是卸载不是运行在 IS 下,没有调用 IS 的事件处理函数的脚本。
所以,如果使用 IS 提供的快捷功能创建快捷方式,记着检查其 Target。如果需要在卸载的时候执行一些特别的动作(比如在你的脚本删除某些文件、删除创建的 IIS 站点等等),那就改为(这里的“7”根据对应的IS版本改为8、9、10):
(请参考〈InstallShield: Creating Uninstallation Shortcut 创建卸载快捷方式〉一文)
[CommonFilesFolder]InstallShield\\Driver\\7\\Intel 32\\IDriver.exe

