在 Wix 中获取生成的 ProductCode 作为变量

Posted

技术标签:

【中文标题】在 Wix 中获取生成的 ProductCode 作为变量【英文标题】:Obtaining generated ProductCode as a variable in Wix 【发布时间】:2013-09-18 23:30:04 【问题描述】:

在我们的产品中,我们使用 Wix 中的Product Id="*" 告诉它为每个新版本生成一个新产品代码。我们现在需要在安装期间将正在安装的 MSI 的产品代码记录到我们的注册表项之一中。我们可以在运行时通过循环“卸载”注册表项中的条目来查找我们的产品名称和版本来推断产品代码,但在安装时直接记录这些信息会更简洁。

Wix 有没有办法告诉我它生成了什么 ProductCode,以便我可以将它作为变量添加到 RegistryValue Wix 元素?

我猜没有,所以我尝试使用<?define?> 为所有问号"????????-????-????-????-????????????" 设置一个变量,并在Product 元素和RegistryValue 元素中使用了这个变量。这适用于 Product 元素 好的,它会继续生成新的 GUID,但在 RegistryValue 元素中,此变量不会在编译时扩展,这意味着注册表项只是添加了所有问号。

是否有任何纯 Wix 方法来实现我想要的?我可以在 Wix 之外生成 ProductCode 并让 Wix 元素将其用作环境变量,但这会给构建过程增加额外的复杂性——其他可能会破坏的东西。如果我能纯粹用 Wix 来做这件事,我会很高兴。

【问题讨论】:

【参考方案1】:

无论您在@ProductCode 中输入什么,产品代码始终作为属性提供。因此,以下内容应该适用于您的情况:

<RegistryKey Root="HKLM" Key="My Product">
   <RegistryValue Name="TheProductCode" Type="string" Value="[ProductCode]" KeyPath="yes" />
</RegistryKey>

此外,它不仅可以放在注册表值中,还可以放在注册表键名中:

<RegistryKey Root="HKLM" Key="$(var.RegistryRoot)\[ProductCode]">
   ...
</RegistryKey>

【讨论】:

以上是关于在 Wix 中获取生成的 ProductCode 作为变量的主要内容,如果未能解决你的问题,请参考以下文章

用Wix手工编辑XML制作C++ MSI安装程序,怎样保证安装新版本时候强制卸载旧版本,急急急!!!

Wix 资源收集工具“Heat”。如何获取具有动态名称的文件,例如构建时生成的 Microsoft 运行时文件

wix 生成新的升级代码

如何在卸载时立即生成WIX执行命令

如何在jsp页面直接获取常量类中的常量

如何用 CPack 生成 WIX 包?