代码之家  ›  专栏  ›  技术社区  ›  kayleeFrye_onDeck

使用WiX工具集时,当值设置为0时,注册表项未更新

  •  7
  • kayleeFrye_onDeck  · 技术社区  · 8 年前

    WiX工具集未使用MSI的预期数据更新注册表项值。如果缺少k:v,则将其添加。如果k:v的数据设置为0,它会完全忽略它,这是这里的实际问题(我认为)

    基本目标是在安装之前验证此注册表项值与预期数据值是否存在,如果必须添加/更新该项,则会触发重新启动提示。

    <?xml version="1.0" encoding="UTF-8"?>
    <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
        <Product Id="*" Name="SampleInstaller" Language="1033" Version="1.0.0.0" Manufacturer="ACME" UpgradeCode="cf6248e9-d7da-4996-9b8e-90072e8510f6">
            <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Platform="x64"/>
            <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
            <Feature Id="ProductFeature" Title="SampleInstaller" Level="1">
                <ComponentGroupRef Id="ProductComponents" />
            </Feature>    
        </Product>
    
        <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
          <Directory Id="ProgramFilesFolder64">
            <Directory Id="INSTALLFOLDER" Name="SampleInstaller" />
          </Directory>
        </Directory>
        <Property Id="VKB_QUERY_HKCU" Secure="yes">
          <RegistrySearch Id="VkbVisibleHkcu"
                Win64="yes"
                Type="raw"
                Root="HKCU"
                Key="Software\Microsoft\TabletTip\1.7"
                Name="TipbandDesiredVisibility"/>
        </Property>
        <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
          <Component Id="ShowVKB_Registry_HKCU" Guid="{97AB4B1D-C9C8-4B34-9328-FF8CA3ED8992}" Directory="INSTALLFOLDER">
            <RegistryKey Id="VKB_Registry_Key_HKCU" Root="HKCU" Key="Software\Microsoft\TabletTip\1.7" ForceCreateOnInstall="yes" ForceDeleteOnUninstall="no">
              <RegistryValue Id="VKB_Registry_Value_HKCU" Action="write" Type="integer" Name="TipbandDesiredVisibility" Value="1"/>
            </RegistryKey>
          </Component>
        </ComponentGroup>
        <InstallExecuteSequence>
          <ScheduleReboot After="InstallFinalize">NOT (VKB_QUERY_HKCU = "#1")</ScheduleReboot>
        </InstallExecuteSequence>
        </Fragment>  
    </Wix>
    

    MSIEXEC 总是回来 0 而不是 3010 1641 $LastExitCode %errorlevel% . 我没有处理过不同的重新启动行为,但我认为有重新启动提示会导致我的安装程序退出非零状态,因此我们也非常感谢您提供的任何指导。

    2 回复  |  直到 8 年前
        1
  •  0
  •   PhilDW    8 年前

    为此,安装并创建详细日志,其中包含:

    msiexec/I[msi的路径]/l*vx[文本日志文件的路径]

    看看属性值等。没有得到3010退出结果的最可能原因是ScheduleReboot条件为false。

    你的一条评论提到了%errorlevel%,但不清楚为什么这是相关的。如果您是从批处理文件或类似文件启动此操作,那么这是需要添加的有用信息。此外,如果您以与当前交互用户不同的方式安装此软件,那么了解这一点也很有用。

        2
  •  0
  •   kayleeFrye_onDeck    8 年前

    因此,该示例可以工作,但您不能通过重新运行安装来重复测试它。您必须先卸载它,否则会像我一样偶然发现原因,并在重新运行之前重新编译。

    我注意到,该示例只有在重新编译后才能正常工作。因此,我猜想安装程序在编译时有一个GUID或与之相关的东西,然后将其包含在安装中。当重新运行安装程序时,它会快速运行并关闭,而不是要求您先卸载或删除现有产品,因此我假设它只是没有评估我的安装程序必须编写密钥,而只是在不需要做更多工作时结束。

    因此,在重新运行MSI之前,请务必卸载MSI,除非您专门尝试触发升级行为。