查找以前安装的版本

时间:2015-09-04 12:58:21

标签: windows-installer installshield

我正在尝试使用InstallShield构建对我们产品的重大升级。只要用户没有选择将其安装到自定义位置,它就可以正常工作。如果他们这样做,则无法找到我创建的用于备份和恢复用户设置(.Net配置文件条目)的代码,因为自定义操作正在查找默认位置。它对原始安装的位置一无所知。卸载能够从该安装中发现INSTALLDIR并将其卸载。 FindRelatedProducts显示:

FindRelatedProducts: Found application: {E881D894-B624-4B8B-8A02-36E2425E3928}

但是,我无法在专有注册表位置以外的任何地方找到该密钥,但没有任何用处:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\InstallShield Uninstall Information\{E881D894-B624-4B8B-8A02-36E2425E3928}

E881D...是我正在升级的安装的ProductCode。我无法按顺序或使用MS编码/打包格式在任何地方找到升级代码。

在我看来,好像能够找到正在升级的软件包的安装位置应该是一个非常基本的功能,因为人们会期望在升级应用程序时用户可能希望将其放回到同一个地方。显然,这些信息可以在某处获得,因为ARP和升级安装程序能够成功删除该应用程序。

此外,有什么方法可以在主要升级期间从原始安装中访问SecureCustomProperties的值?我很确定我知道答案......

1 个答案:

答案 0 :(得分:0)

您可以使用组件搜索。找到安装在该INSTALLDIR位置的文件的组件guid(我假设是主应用程序文件夹)并使用它。在InstallShield中,我认为这是一个系统搜索。它将返回该组件的安装位置的路径,并且它要求该文件是该组件的关键路径。

为了将来参考,您可以通过至少两种方式为此做好准备。

  1. 如果INSTALLDIR是位置,只需在您选择的位置创建一个注册表项(使用标准IDE)并为其指定值[INSTALLDIR],这将在项目写入​​时解析为实际位置到注册表。

  2. 另一个有用的提示是将类型51自定义操作设置为值[INSTALLDIR]的ARPINSTALLLOCATION,我不确定是否有InstallShield接口,但它不需要代码。这导致安装位置在卸载注册表项中,但这基本上是一个实现细节。给定ProductCode和INSTALLPROPERTY_INSTALLLOCATION的API MsiGetProductInfo(及等效项)将返回该主应用程序文件夹位置。