为什么在针对每台计算机的安装中,对于非广告快捷方式会出现ICE57错误?

7
这个问题是在询问ICE57验证器是否会创建虚假的正面错误报告。
我正在使用WIX 3.9生成安装程序。我想要一个每台机器的安装,带有非广告的快捷方式。
这个WXS示例安装一个文本文件和一个打开该文本文件的快捷方式:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="ShortcutTest" Language="1033" 
           Version="1.0.0.0" Manufacturer="Widget Co" 
           UpgradeCode="--YOUR GUID1--">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate EmbedCab="yes"/>

    <Feature Id="ProductFeature" Title="ShortcutTest" Level="1">
      <ComponentRef Id="TextFile" />
      <ComponentRef Id="ShortCut" />
    </Feature>

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="ShortcutTest">
          <Component Id="TextFile" Guid="--YOUR GUID2--">
            <File Id="File" Name="TextFile.txt" Source="TextFile.txt" KeyPath="yes"/>
          </Component>
        </Directory>
      </Directory>

      <Directory Id="ProgramMenuFolder">
        <Directory Id="ApplicationProgramsFolder" Name="Shortcut Test">
          <Component Id="ShortCut" Guid="--YOUR GUID3--">
            <RegistryValue Root="HKMU" Key="Software\WidgetCo\ReadMeTextFile\TextFile" Name="Installed" Type="string" Value="yes" KeyPath="yes"/>
            <Shortcut Id="Shortcut"
                Name="Open Text File"
                Description="Opens a text file"
                Target="[INSTALLFOLDER]TextFile.txt"
                WorkingDirectory="INSTALLFOLDER"/>
            <RemoveFolder Id="ApplicationProgramsFolder" Directory="ApplicationProgramsFolder" On="uninstall"/>
          </Component>
        </Directory>
      </Directory>
    </Directory>
  </Product>
</Wix>

如果将上述示例构建为MSI包,则会出现以下内部一致性评估器(ICE)错误:
D:\Robert\Documents\Visual Studio 2013\Projects\ShortcutTest\Product.wxs(27,0): error LGHT0204: ICE57: Component 'ShortCut' has both per-user data and a keypath that can be either per-user or per-machine. ICE57 暗示了每个用户和每台计算机数据之间的不一致性。但是,组件的关键路径是HKMU,在单台机器安装中解析为HKLM(HKEY_LOCAL_MACHINE)。快捷方式的位置源自“ProgramMenuFolder”,在单台机器安装中解析为C:\ProgramData\Microsoft\Windows\Start Menu\(在Windows 8.1上)。该组件的任何资源都没有任何与每个用户相关联的内容。
您可以通过禁止ICE57将安装程序包构建为MSI。生成的MSI包安装时没有明显的错误。多个用户可以登录并访问快捷方式。任何用户都可以卸载软件包,并删除软件包中的所有资源。 Wix create non advertised shortcut for all users / per machine的答案有一个有趣的解决方法,即编写广告快捷方式,然后关闭广告。看起来是创建未广告的快捷方式的迂回方法。
ICE57错误的常见修复方法是将<RegistryValue...>根更改为HKCU(HKEY_CURRENT_USER)。但是,这会创建一个安装程序,在卸载时可能会留下用户注册表键。例如,如果用户A安装了软件包,则会向用户A的注册表中添加一个条目。如果用户B删除该软件包,则不会从用户A的注册表中删除该条目。
在这种情况下,ICE57错误是否是内部一致性评估器中的错误?还是我理解错了什么?
2个回答

3

在研究另一个问题时,我在http://sourceforge.net/p/wix/mailman/message/26687047/上发现了Rob Mensching的评论:

IIRC,这是ICE57中的一个错误。在评估这些值时,Windows Installer团队没有考虑ALLUSERS属性...不过那是很久以前的事情了,所以我的记忆可能有点模糊。

看起来这是ICE57中的一个错误。


0

将您的快捷方式移动到文件的子级,并添加Adversite="yes"属性。 RegistryValue应该可以将快捷方式从perUser转换为perMachine。

<Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="ProgramFilesFolder">
            <Directory Id="INSTALLFOLDER" Name="MyApp" />
        </Directory>

        <Directory Id="ProgramMenuFolder" Name="Programs">
            <Directory Id="ApplicationProgramsFolder" Name="My App Name" />
        </Directory>
    </Directory>
</Fragment>

<Fragment>
    <ComponentGroup Id="ComponentGroup_Core">
        <Component Id="Component_App" Guid="INSERT_GUID_HERE" Directory="INSTALLFOLDER">

            <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[AppName]" 
                           Name="AppInstalled" Type="string" Value="yes" KeyPath="yes"/>

            <File Id="MyApp" Name="My Test App.txt">
                <Shortcut Id="Shortcut"
                          Name="Open Text File"
                          Description="Opens a text file"
                          Directory="ApplicationProgramsFolder"
                          WorkingDirectory="INSTALLFOLDER" />
            </File>
        </Component>
        <Component Id="Component_MenuFolder" Guid="INSERT_GUID_HERE"
                   Directory="ApplicationProgramsFolder">
            <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[AppName]"
                           Name="MenuFolderInstalled" Type="string" Value="yes"
                           KeyPath="yes"/>
            <RemoveFolder Id="RemoveFolder_App" On="uninstall" />
        </Component>
    </ComponentGroup>
</Fragment>

这个回答将快捷方式更改为广告快捷方式,这不是我要找的答案。问题是关于ICE57和每台机器安装中未公布的快捷方式。您的答案确实强调了缺少KeyPath属性,我已在问题中进行了修复。 - bradfordrg
你说得对,据我所知,无法解决perMachine安装中的ICE57和未公开的快捷方式问题。我们能做到的是在“All Users”文件夹中创建一个快捷方式,它不会像广告那样运行(因为它在All Users中,不会触发任何安装),但它将被声明为这样的快捷方式。 - Marlos
我认为从广告切换的主要区别是:a)它使得更难找到快捷方式的目标,b)如果目标文件丢失,则快捷方式将启动安装程序以修复组件。我大约有90%的把握,这个特定的ICE57测试会产生误报错误。 - bradfordrg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接