如何用Installshield developer 做升级安装包

jackyzheng 2003-07-09 03:03:23
本人用Installshield developer 7.02做安装包,要求在卸载时会弹出一个窗口,有两个选项,一项是:升级程序;另一项是:删除程序。
请问,“升级程序”部分的功能如何实现。
...全文
161 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
喝醉的咖啡 2003-07-30
  • 打赏
  • 举报
回复
对 InstallShield 安装的程序最标准的卸载方法是
执行:
InstallShield 8:
"X:\Program Files\Common Files\InstallShield\Driver\8\Intel 32\IDriver.exe" /M{ProductGUID}
InstallShield 7:
"X:\Program Files\Common Files\InstallShield\Driver\7\Intel 32\IDriver.exe" /M{ProductGUID}

也就是说,关键是知道你要卸载的软件包的 产品安装包 GUID。

在 InstallShield 执行过程中,可以通过全局常量 UNINSTALL_STRING 获得上面这一串东西。只是要注意,在 InstallShield 8 中 UNINSTALL_STRING 的 " 位置不正确地将执行参数 /M{ProductGUID} 也包括在其中,导致系统找不到名为"X:\Program Files\Common Files\InstallShield\Driver\8\Intel 32\IDriver.exe /M{ProductGUID}"的可执行程序而卸载失败。所以要在程序中对 UNINSTALL_STRING 进行处理,将其"位置改一改(在回答另外一位朋友的提问中有代码)。

有了正确的 UNINSTALL_STRING,卸载软件包只需如此:
LaunchAppAndWait(UNINSTALL_STRING,"",WAIT);


另外,对一个安装程序使用 /uninst 参数也能执行对该版本软件的卸载工作。

在 InstallShield 的 help 中提到了几个获取软件版本信息和进行卸载操作的函数,但文档中同时说明不在 InstallShield Developer 版本中支持,遗憾。


所有符合 MSI 标准安装的程序,都会将注册信息存放到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
下面,可以全部列出来。添加删除程序就是从这里获取列表的,如果不知道 ProductCode(Product GUID),可能要在这里遍历每一个项,对其版本和名称进行判断后找到你需要的产品,得到ProductCode,才能删除。
我仔细查阅了 MSI 和 InstallShield 的 help,都没有找到方法直接通过产品名称和版本号码获得ProductCode。
davidwolf 2003-07-29
  • 打赏
  • 举报
回复
如果不管版本新久都卸載呢?
喝醉的咖啡 2003-07-28
  • 打赏
  • 举报
回复
对了,ISD7.04 做补丁包是一个单独的工具,在工具菜单里。
我琢磨了很久都没用成功,后来换 ISD8.02才搞定(也有些小毛病)。

注意:ISD8.* 做的安装程序和 ISD7.* 做的安装程序不兼容。
喝醉的咖啡 2003-07-28
  • 打赏
  • 举报
回复
在 InstallScript 编辑中对 Uninstalled 事件进行处理

///////////////////////////////////////////////////////////////////////////////
// EVENT: Uninstalled event is sent just after files for the feature:
// \MainApp are removed during uninstallation.
///////////////////////////////////////////////////////////////////////////////

export prototype MainApp_UnInstalled();
function MainApp_UnInstalled()
begin

end;

比如用 LaunchApp 来调用你的另外一个安装程序。


不过我认为你的描述有问题,准确地说应该是:在安装一个新版本之前卸载老版本。
我用的方法是在 OnBegin 中判断当前正要安装的版本是否比原有版本更新,如果是,则调用 LaunchAppAndWait(UNINSTALLSTRING,WAIT) 来卸载原有版本,随后继续安装。
否则,如果依靠ISD自己升级的话,ISD会自动判断提示用户进行“更新”,但在更新之后就有很多问题了。

对于InstallShield Developer 8.02 的 Uninstallstring 存在的一些问题我在另外回答朋友的问题中做了解释。

最后:ISD 基于 MSI 提供了 patch 制作能力,可以不卸载原有版本完成“补丁”升级。你可以在原有的版本基础上,用现有版本很简单的作出差异的补丁来。不过经验来看,最好不要用对原有文件进行二进制修改方式的补丁(没必要那么节省空间),我喜欢用新文件覆盖久文件。
再,ISD的在线自动升级功能不如 WiseInstaller 好用。可惜后者的最新版本在我这里始终无法使用该功能(程序错误),我只好自己写了2个在线自动升级程序(一个模仿WindowsUpdate,一个模仿Windows AutoUpdate小程序),定时检查并下载用 ISD8.02做的补丁程序。
期待 ISD 的UpdateService能够更加方便,Wise的在线升级的bug快点儿解决!
davidwolf 2003-07-28
  • 打赏
  • 举报
回复
觀注
jackyzheng 2003-07-21
  • 打赏
  • 举报
回复
up
jackyzheng 2003-07-16
  • 打赏
  • 举报
回复
请大家帮帮忙呀:
如何用Installshield developer 实现把老版本卸载后自动更新成新版本.
jackyzheng 2003-07-15
  • 打赏
  • 举报
回复
大家救命啊
wuq2003 2003-07-15
  • 打赏
  • 举报
回复
up
jackyzheng 2003-07-14
  • 打赏
  • 举报
回复
up

3,423

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 其他开发语言
社区管理员
  • 其他开发语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧