6

我们的应用程序在运行时将一些注册表设置写入 HKCU 配置单元。我想在卸载期间删除此设置。这是代码:

  <Fragment>
    <DirectoryRef Id="INSTALLLOCATION" DiskId="1" FileSource="$(var.SourceDirProject)\">
      <Component Id="DeleteHkcuManufacturerHive" Guid="GUID">
        <Condition>REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE</Condition>
        <CreateFolder/>
        <RemoveRegistryKey Action="removeOnUninstall"
 Id="HKCUkey" Root="HKCU" Key="Software\$(var.Manufacturer)"/>
      </Component>
    </DirectoryRef>
  </Fragment>

ICE57:组件 'DeleteHkcuManufacturerHive' 具有每用户和每机器数据以及每机器 KeyPath。
为什么我得到 ICE57?安装是按用户进行的。提前致谢。

UPD:每台机器的元素在哪里?可能是 INSTALLLOCATION=Program Files\ManufacturerDirectory?

4

2 回答 2

7

您正在 HKCU 配置单元上进行操作,该配置单元仅对当前用户可用。

MSDN状态:

ICE57 验证单个组件不会混合每台机器和每用户的数据。此 ICE 自定义操作检查注册表项、文件、目录键路径和非广告快捷方式。在同一个组件中混合每个用户和每个机器的数据可能会导致在多用户环境中的某些用户只能部分安装该组件。

ICE 是对您的安装包的验证。如上所述,ICE57 是为了确保您不会混淆每台机器和每用户的结构。如果您必须在卸载期间删除 HKCU 的条目(并且该软件是在每台计算机上安装的),那么您可以在 Visual Studio 中的“属性”>“工具设置”中关闭该特定验证,如下面的屏幕截图所示:

在此处输入图像描述

但是,您可能需要考虑问题的根本原因。如果您正在执行每台机器的安装,您的安装程序或应用程序可能不应该写入 HKCU,因为它只对当前用户可用,而您的应用程序是为所有用户安装的。

于 2012-09-14T10:57:28.947 回答
3

我在wix-users 邮件列表上得到了答案。这是Peter Shirtcliffe的回答:

ProgramFiles 是每台机器的位置。您只能在提升时访问它。如果您想在每用户安装中安装程序代码,您应该安装到 %LocalAppData%\Programs。

完全删除条件。该组件将被安装,但在您卸载应用程序之前不会生效。此时,当组件被删除时,注册表项也将被删除。

于 2012-09-19T05:08:34.890 回答