0

我有一个 Installshield Basic MSI 安装程序,用于安装我们产品的新版本。如果用户仍在使用旧版本(由 Installscript 安装程序安装),安装程序将在继续安装新产品之前执行旧产品的卸载字符串。

当用户卸载我们产品的新版本时,这会导致一些问题。当要添加/删除程序并运行卸载程序时,卸载程序会运行并删除文件,但是当刷新添加/删除列表时,产品似乎仍处于安装状态。这些文件已被删除,但注册表中有产品的残余。

有效卸载产品的唯一方法是通过第 3 方注册表清理程序(可能还有一个由此构建的脚本)。奇怪的是,如果用户在安装新产品之前手动卸载旧产品,新产品的卸载将正常工作。此外,在机器上没有旧产品的情况下安装新产品也会导致完全卸载。

这两种产品有不同的产品代码。有什么想法可能导致这种情况吗?谢谢!

4

3 回答 3

1

您可能在新产品安装过程中调用旧产品卸载字符串。MSI 安装脚本记录所有更改,还包括“卸载旧”更改。当您卸载新产品时,这些更改会被还原,因此 MSI 会恢复开始安装之前存在的注册表项。这些条目包括旧的产品卸载条目。

我对 InstallShield Basic MSI 模式知之甚少。如果它具有更改安装顺序或设置执行操作的时间的能力,则应确保旧产品的卸载发生在 InstallValidate 和 InstallInitialize 标准操作之间。如果 InstallShield 没有给您这样的控制权,您可能不得不要求您的用户手动卸载旧版本。

请参阅这篇关于卸载操作放置的文章:http: //jpassing.com/2007/06/16/where-to-place-removeexistingproducts-in-a-major-msi-upgrade/

于 2013-04-14T10:55:03.807 回答
1

如果添加/删除程序中显示未卸载的任何内容,则此处的注册表项仍然存在:

HTLM/Software/Microsoft/Windows/CurrentVersion/Uninstall/{ProductGUID or Name}

或对于 64 位系统:

HKLM/Software/Wow6432Node/Microsoft/Windows/CurrentVersion/Uninstall/{ProductGUID or Name}

包的卸载部分,确保它们:

  1. 没有相同的产品 ID(您已经说过,但请确保;))
  2. 如果需要,请在代码中添加一行以删除剩余的注册表项。

您可以将文件嵌套到 Installshield 和 Wise 软件包工作室。您可以编写一个 .bat 文件,将其放在临时目录中,对其进行编码,以便在运行时删除 ex 中的最后一位。注册表项。

或者

创建一个虚拟机,安装新产品,使用 Wise 捕获它并以这种方式进行部署。

如果没有看到 Installshield 中的代码,我不知道我能给出什么详细的解释......

格力!!!

于 2013-04-12T16:09:34.490 回答
1

我假设您没有在新安装程序中正确设置升级机制。也许您在升级菜单中的项目上选择了“安装设置然后删除不需要的文件”。如果是这样,请将其更改为“首先删除旧设置”并检查您是否使用了正确的 UpgradeCode。或者只是为以前版本的安装程序创建一个新的升级项目,并在安装前将其删除。

于 2013-04-15T13:28:05.040 回答