使用WiX Toolset时,将值设置为0时,注册表项不会更新

kay*_*eck 7 registry windows-installer wix msiexec windows-10

用于MSI的WiX工具集未使用其预期数据更新注册表键值.如果缺少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>
Run Code Online (Sandbox Code Playgroud)

此外,它似乎是从退出代码MSIEXEC总是返回0代替30101641检查时$LastExitCode%errorlevel%.我没有搞乱不同的重启行为,但我认为重启提示会导致我的安装程序退出非零,所以任何指导也有所值.

kay*_*eck 0

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

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

所以基本上这是一个测试错误/缺乏内在的 WiX 知识。

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

我不确定为什么我没有收到有关已存在产品的错误。我本以为这肯定是默认行为。