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

时间:2017-09-30 04:24:09

标签: wix windows-installer windows-10 registry msiexec

用于MSI的WiX Toolset未使用其预期数据更新注册表项值。如果缺少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和{{1}时,似乎0的退出代码始终返回3010而不是1641 $LastExitCode }。我没有搞乱不同的重启行为,但我认为重启提示会导致我的安装程序退出非零,所以任何指导也都很感激。

2 个答案:

答案 0 :(得分:0)

执行此操作并使用以下命令创建详细日志:

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

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

假设所有内容都按预期工作,问题可能是您需要在属性声明中将Secure设置为Yes,否则该值不会从UI序列注册表搜索转移到执行序列中。如果日志显示它在安装开始时获得了正确的值但稍后丢失了,则很可能是问题。

您的一条评论指的是%errorlevel%,但不清楚为什么这是相关的。如果您是从批处理文件或类似文件启动它,那么这是添加的有用信息。此外,如果您以某种方式安装它,与当前的交互式用户分开,那么这也是有用的。

日志似乎表明一切都很好。属性具有看起来正确的值,并执行ScheduleReboot操作。我看到的唯一问题是Windows Installer没有显示要求用户进行重新启动的对话框,因此它执行非交互式操作,即返回3010以告知调用者需要重新启动。没有明显的理由说明Windows Installer没有提示重新启动(这是ScheduleReboot的功能),但如果安装是在非交互式用户上下文中运行,那么Windows将不会向其他用户显示桌面对话框(或没有用户没有人登录)。

答案 1 :(得分:0)

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

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

所以基本上它是一个测试错误/缺乏固有的WiX知识。

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

我不确定为什么我没有收到有关已有产品的错误消息。我当然会想到这将是默认行为。