1、installshield卸载实现在后面的容中,主要解答以下几个经常有朋友问到,却又往往得不到很好的解决的问题:如何创建卸载快捷方式? 为什么卸载的时候不执行 OnMaintUIBefore 和 OnMaintUIAfter? 为什么卸载的时候不执行 OnUnInstall? 为什么卸载的时候并没有调用 OnMaintUIBeforeXXXX 或者 OnUnInstall,甚至连 OnBegin、OnAppSearch、OnShowUI 等等事件处理函数都没有调用? 为什么第二次运行安装程序的时候毫无提示就卸载了以前的版本并没有调用 OnMaintUIBeforeXXXX 或者 OnUnIns
2、tall? -关于如何创建卸载快捷方式的问题,请参考:InstallShield: Creating Uninstallation Shortcut 创建卸载快捷方式一文请记住那个表格。在脚本中创建卸载快捷方式最好的方法就是用用于定义常量 UNINSTALL_STRING 提供的值。而在 IS 操作界面中创建卸载快捷方式最好参考帮助中(参考该文)表格的方法,根据不同的项目类型采用不同的方法。如果用 IS 提供的方便功能创建的卸载快捷方式有些毛病,最好改改至于原因,在后面会提到。-为什么卸载的时候不执行 OnMaintUIBefore 和 OnMaintUIAfter? 为什么卸载的时候不执行
3、OnUnInstall ? 在 General Information - Project Properties 你能看到:Enable Maintenance 这一选项。如果设置为 Yes,那么当用户在一台已经安装了该软件的计算机上再次运行安装程序,则会自动运行 OnMaintUIBefore 和 OnMaintUIAfter 事件处理函数中的脚本。如果设置为 No,那就会调用 UnInstall 事件处理函数的脚本。那么,如果卸载的时候不执行这两个事件处理函数的脚本,就要检查一下这一设置了。但(呵呵,这里有个“但”),卸载的时候也可能不运行这两个函数以及 OnUnInstall,耐心看下去
4、吧。-为什么卸载的时候并没有调用 OnMaintUIBeforeXXXX 或者 OnUnInstall,甚至连 OnBegin、OnAppSearch、OnShowUI 等等事件处理函数都没有调用? 1、安装程序如果运行在“安静”模式下,则不会执行这些事件处理脚本。比如 setup.exe /s 或者 IDriver.exe /MProduct Code /uninst 这样的调用 (请参考:InstallShield: Creating Uninstallation Shortcut 创建卸载快捷方式一文)。2、如果不是在“安静模式”,用户在控制面板的 添加删除程序 中,直接点了列在程序项后
5、面的“删除”而不是“更改”,则会运行在 REMOVEONLY 模式下。此时不出现维护界面,但并不是没有执行相应脚本。假如 Enable Maintenance 的设置为 Yes,按照上面的说法,显然应该执行 OnMaintUIBefore 事件处理函数的脚本,但因为其默认代码如图:所以不会调用 SdWelcomeMaint ,也就不会出现维护界面。所以容易错以为 OnMaintUIBefore 没有效果。我们来看看“添加删除程序”的按钮和设置的关系:其设置结果如图:3、不同的方法创建的卸载快捷方式也可能导致卸载过程不执行任何脚本。最近一次为 xzSQLDeploy 制作安装程序(请参考Inst
6、allShield Example: 演示 xzSQLDeploy 和 xzIISConfig 脚本的使用一文提供的 InstallShield X 制作的例),我采用了 IS 提供的快捷功能来创建卸载快捷方式:在 Project Assistant 方式下的 Application Shortcuts 这一步执行左边的 Create an Unstallation Shortcut(请参考InstallShield: Creating Uninstallation Shortcut 创建卸载快捷方式一文) :结果对比发现该快捷方式采用的是 MSIExec.exe 的 /x 参数来进行卸载于是
7、卸载不是运行在 IS 下,没有调用 IS 的事件处理函数的脚本。所以,如果使用 IS 提供的快捷功能创建快捷方式,记着检查其 Target。如果需要在卸载的时候执行一些特别的动作(比如在你的脚本删除某些文件、删除创建的 IIS 站点等等),那就改为(这里的“7”根据对应的IS版本改为8、9、10):(请参考InstallShield: Creating Uninstallation Shortcut 创建卸载快捷方式一文)CommonFilesFolderInstallShieldDriver7Intel 32IDriver.exe连同参数,在目标计算机上就等同于%SystemDrive%Pr
8、ogram FilesCommon FilesInstallShieldDriver10Intel 32IDriver.exe /M你的产品的 Product Code如果你按照上面说的方法采用 UNINSTALL_STRING,并调试输出其值,你会发现它就是上面的容 oo-为什么第二次运行安装程序的时候毫无提示就卸载了以前的版本并没有调用 OnMaintUIBeforeXXXX 或者 OnUnInstall? 注意下图:在 Tools 菜单中选择 Options,在弹出窗口的 Preferences 这一页去掉对 Uninstall before installing 的选中,重新编译并运行
9、。如果 Enable Maintenance 的设置为 Yes,执行 Setup.exe 完成安装,然后再次执行 Setup.exe 就会出现下图所示的维护界面:如果 Enable Maintenance 的设置为 No,则执行 OnUninstall 事件处理函数的脚本。如果不想出现那个讨厌的提示框,那你爱怎么改就怎么改了 ooFeedback# XiaoZhu.: InstallShield 卸载相关问题 2004-10-24 12:35 piggybank Ping Back来自: # re: InstallShield 卸载相关问题 2004-10-27 10:19 pk piggyb
10、ank,请教两个问题。 1.用installshield X,能在脚本里远程调用另外一台机器里的可执行程序吗?我用LaunchAppAndWait()试过,不行。 2.安装程序如何要实现以下功能:先往被安装机器里拷贝一些文件,修改注册表,重新启动机器,然后执行先前刚拷到机器里的一个可执行程序。 ! # re: InstallShield 卸载相关问题 2004-10-27 11:07 piggybank pk,不用客气 1、InstallShield 中涉及到 LaunchAppAndWait 等不支持网络资源访问。但是可以测试一下先把网络资源映射为本地硬盘,应该是可以的。 2、启动时运行,一
11、般都是在注册表的 Run、RunOnce 或者启动组方一个快捷方式来实现的。 比如: HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnce HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunServices
12、 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunServicesOnce InstallShield 自己也支持安装过程中中途重新启动,下次继续。 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnce HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx HKEY_LOCAL_MACHINESystemCurrentControlSetSession ManagerFile
13、RenameOperations 比如 IS 会监视在安装过程中上述注册表位置下的项是否发生变化,如果发生变化表明需要重新启动。 当然,在你的需求里只要把你要运行的程序的快捷方式放到快捷组里就足够了。 # re: InstallShield 卸载相关问题 2004-10-28 10:48 pk piggybank,你的答复! 怪我自己,昨天没把情况讲清楚。 其实我现在遇到的问题是: 刚刚完成了一个JSP作的信息管理系统,B/S的。数据库用的是ORACLE9i,OS是windows2000server,我本来按照以往的方法作好了一个在数据库服务器本地执行的数据库安装和初始化程序SRVINST,包
14、括创建用户、建表等等。是由批处理命令和SQL文件组成的,功能和你提供的xzSQLDeploy类似(我的没有GUI界面,难看些,呵呵)。现在项目要验收了,用户忽然要求作一个所谓的数据库远程安装程序,就是说在任何一台联网的机器上(可能没有安装ORACLE客户端),只要运行安装程序,就能对指定的数据库服务器进行数据库的安装和初始化,当然前提是服务器端的ORACLE实例已经建好,并且监听和实例等服务都启动了。 我原本考虑了两个解决的方法: 第一就是看能否在InstallShield里能否远程访问?如果行,就直接调用服务器上的SQLPLUS执行本地的SRVINST。也就是我昨天问你的问题1。不过看来好像不行呀,我不能要求用户在安装前先将服务器网络资源映射为本地硬盘呀。领导那儿也通不过的。 第二就是干脆将ORACLE的客户端打包到安装程序里(虽然有点问题,好在服务器端的ORACLE是用户掏钱了的,将就点了)。 具体是: 1.将打包的ORACLE 9i的客户端文件和数据库创建及初始化程序SRVI
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1