2

Software\$(var.Manufacturer)我的公司有很多产品,如果我们的客户安装了多个产品(很可能),我们希望创建一个包含我们所有产品的注册表项,然后我想为我们的每个产品创建一个辅助密钥,这些产品将被删除卸载但主要的没有。我试图像下面那样实现这一点,但是我的主键被删除了,所以我的所有其他产品也从注册表中删除了。我知道这是微不足道的,但我找不到答案。

<DirectoryRef Id="TARGETDIR">
  <Component Id="Registry" Guid="*" MultiInstance="yes" Permanent="yes">
    <RegistryKey Root="HKLM" Key="Software\$(var.Manufacturer)" ForceCreateOnInstall="yes">
      <RegistryValue Type="string" Name="Default" Value="true" KeyPath="yes"/>
    </RegistryKey>
  </Component>
</DirectoryRef>

<DirectoryRef Id="TARGETDIR">
  <Component Id="RegistryEntries" Guid="*" MultiInstance="yes" >
    <RegistryKey Root="HKLM" Key="Software\$(var.Manufacturer)\[PRODUCTNAME]" Action="createAndRemoveOnUninstall">
      <RegistryValue Type="string" Name="Installed" Value="true" KeyPath="yes"/>
      <RegistryValue Type="string" Name="ProductName" Value="[PRODUCTNAME]"/>
    </RegistryKey>
  </Component>
</DirectoryRef>

编辑:我已经让我的注册表项继续使用以下代码。但是,他们只是全部删除,所有产品都被删除,而不是根据需要一一删除。

<DirectoryRef Id="TARGETDIR">
  <Component Id="Registry" Guid="FF75CA48-27DE-430E-B78F-A1DC9468D699" Permanent="yes" Shared="yes" Win64="$(var.Win64)">
    <RegistryKey Root="HKLM" Key="Software\$(var.Manufacturer)" ForceCreateOnInstall="yes">
      <RegistryValue Type="string" Name="Default" Value="true" KeyPath="yes"/>
    </RegistryKey>
  </Component>
</DirectoryRef>

<DirectoryRef Id="TARGETDIR">
  <Component Id="RegistryEntries" Guid="D94FA576-970F-4503-B6C6-BA6FBEF8A60A" Win64="$(var.Win64)" >
    <RegistryKey Root="HKLM" Key="Software\$(var.Manufacturer)\[PRODUCTNAME]" ForceDeleteOnUninstall="yes">
      <RegistryValue Type="string" Name="Installed" Value="true" KeyPath="yes"/>
      <RegistryValue Type="string" Name="ProductName" Value="[PRODUCTNAME]"/>
    </RegistryKey>
  </Component>
</DirectoryRef>
4

1 回答 1

1

Guid="*" 在这里可能不适合您。您需要使用将 Shared 属性设置为 true 的静态 GUID(可能在一个片段中,以便它可以由多个产品共享)。您可以按照对子项执行此操作的方式执行此操作。

这样 MSI 将正确引用计数父键并知道何时删除它。

于 2012-09-11T18:15:53.120 回答