繁体   English   中英

如何确定以前的WIX Install安装程序的文件夹

[英]How to determine the folder that a previous WIX Install installed a program in

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

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

托尼

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

我已经对此做了一些研究,这是我提出的解决方案:

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

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键。

托尼

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

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

这仅在您在Product Element中使用相同的UpgradeCode属性时才有效。

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM