当keypath是RegistryKey / Value时,Wix使用什么元素来自动生成ComponentId guid

时间:2014-05-02 14:37:12

标签: wix guid shortcut registrykey

我有一个相对通用的Wix(3.8)项目,因为我们尝试使用各种工具(如预处理器)来生成多个Demo安装程序,以更改名称,包含不同的文件和选项。我还修改了每个ProductId / ProductCode / UpgradeCode,以便它们显示为2个不同的产品并且并排安装。单独安装和卸载一个工作正常。当我并排安装2个并卸载一个时,有几个被遗弃的资源,其中一个是快捷方式。

以下是我用于快捷方式的代码:

<DirectoryRef Id="DesktopFolder">
  <Component Id="DesktopShortcuts"
             Guid="*">
    <Shortcut Id="ApplicationDesktopShortcut"
              Name="!(bind.property.ProductName)"
              Description="Demo Application"
              Target="[INSTALLDIR]Demo.exe"
              WorkingDirectory="INSTALLDIR"
              Advertise="no"/>
    <RegistryKey Root="HKMU"
                 Key="SOFTWARE\$(var.Manufacturer)\!(bind.property.ProductCode)\DesktopShortcuts">
      <RegistryValue Name="Installed"
                     Type="integer"
                     Value="1"
                     KeyPath="yes" />
    </RegistryKey>
  </Component>
</DirectoryRef>

在查看安装程序日志后,我注意到快捷方式的ComponentId始终相同,这解释了废弃的资源(快捷方式)。

我的印象是因为我的注册表值的路径对于每个安装程序是不同的(请注意我将产品代码绑定到密钥中)我会因为Guid =&而为每个安装程序获得不同的Guid #34; *&#34;属性。但是,wix文档不清楚WRT注册表项,我找到的其他讨论也是如此。显然,对于位于不同目录中的文件,这不是问题。

例如thisWix docs

1 个答案:

答案 0 :(得分:3)

所以我弄清楚发生了什么。这一切都与这条线上的一些微妙问题有关:

 Key="SOFTWARE\$(var.Manufacturer)\!(bind.property.ProductCode)\DesktopShortcuts">

如问题中所述,文档和参考资料表明文件和注册表项的路径用于动态生成Guid。请注意,路径包括文件/值名称。这实际上正在发生但是我如何使用2个不同的ProductCodes为2个不同的安装程序获得ComponentId的相同Guid?你会认为将ProductCode包含在路径中会使每个都是唯一的。事实证明,这是因为我在路径中使用了!(bind.property.ProductCode)。在光线链接阶段之前,粘合剂变量不会被替换。 Guid =“*”元素是在编译阶段使用Candle生成的,显然是在链接器之前。因此,当替换发生并且在注册表中生成正确的密钥时,Guid是从非唯一路径生成的:

SOFTWARE\MyCompany, Inc\!(bind.property.ProductCode)\DesktopShortcuts\Installed

因此,在使用自动生成的Guid功能时,请勿在任何KeyPath元素中使用binder变量。