【问题标题】:Find INSTALLDIR of previously installed version查找以前安装版本的 INSTALLDIR
【发布时间】:2015-11-30 15:36:08
【问题描述】:

我正在尝试使用 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 的值?我很确定我知道答案...

【问题讨论】:

    标签: windows-installer installshield


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。我喜欢 ARP 解决方案,即使它是恕我直言,过于复杂。作为安装程序的新手,我从来没有想过这样的基本功能不会由 MSI 自动完成。我不希望它出现在我 20 多年来使用过的最大的 POS 软件 IS 中。那就是使用 Lotus Notes。)我真的很遗憾没有从一开始就接受学习 WiX 的“打击”。我现在当然必须采用组件搜索方法,但我会在未来修复这个安装程序。
    • 所以我需要部分撤回我之前的一些评论。似乎 InstallShield 确实 实际上有一个自定义操作类型 51,它设置了 ARPINSTALLLOCATION。我通过尝试添加我自己命名的 SetARPINSTALLLOCATION 发现了这个事实,巧合的是,它恰好与 IS 选择的名称相同。因为这不像他们已经记录了它或任何东西(继续搜索“InstallShield APRINSTALLLOCATION”)。或者提供了一种使用它的方法。典型的半途而废的 IS 实施。
    猜你喜欢
    • 1970-01-01
    • 2020-12-30
    • 2011-05-15
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    相关资源
    最近更新 更多