【问题标题】:How to determine the folder that a previous WIX Install installed a program in如何确定以前 WIX Install 安装程序的文件夹
【发布时间】:2011-09-13 20:47:55
【问题描述】:

我们产品的现有安装程序不会将任何信息写入注册表,也不会写入任何自定义环境变量。允许用户在安装程序的 UI 中更改安装目录。升级时,如何查看上一个版本安装到哪个文件夹?

我需要知道文件夹,这样我才能找到以前的配置文件并从中复制值。新版本的配置文件有新的标签和新的结构,所以我不能只保留以前的文件并重复使用它。

托尼

【问题讨论】:

    标签: wix


    【解决方案1】:

    MSI 没有直接的信息。 (MSI 包可以有多个“根”目录,因此不知道开发人员可能需要哪一个。)如果您在注册表中有目录,请使用RegistrySearch。否则,您可以在自定义操作中使用MsiGetComponentPath

    【讨论】:

      【解决方案2】:

      我对此进行了一些研究,这是我想出的解决方案:

      安装程序完成安装后,它会在注册表中的路径下创建一个节点

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<Product ID>
      

      在 32 位操作系统上安装 32 位或在 64 位操作系统上安装 64 位,或

      HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\<Product ID>
      

      在 64 位操作系统上安装 32 位。

      此节点包含一个名为 InstallLocation 的值,它为您提供了安装可执行文件的路径。

      很遗憾,我们的安装程序之前的版本没有设置这个属性,所以我不能使用它。但是我们的安装程序创建了一个服务。我在该服务的注册表中找到了节点的路径。从那里,我可以检索 ImagePath 值的值并从服务的 .EXE 文件名中提取路径。

      所以我的解决方案是:

      1. 修复新安装程序,使其设置 InstallLocation 值。
      2. 仅从以前的版本升级时,它将检索服务的注册表节点并使用服务的 ImagePath 键。
      3. 如果从任何更高版本升级,我们将检索 Uninstall 节点并使用 InstallLocation 键。

      托尼

      【讨论】:

        【解决方案3】:

        msiexec 保留上次安装的 msi 副本,因此它将处理卸载以前的版本,您只需包含 InstallExecuteSequence 部分

        <InstallExecuteSequence>
          <RemoveExistingProducts After="InstallValidate" />
        </InstallExecuteSequence>
        

        仅当您在产品元素中使用相同的 UpgradeCode 属性时,这才有效。

        祝你好运!

        【讨论】:

        • 对不起,我忘了指出我需要安装文件夹来找到旧的配置文件,这样我就可以从中读取数据以复制到新的配置文件中。我已编辑问题以包含该信息。
        猜你喜欢
        • 1970-01-01
        • 2012-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多