You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wix 4补丁未修改注册表值却被还原至初始值的问题咨询

Wix 4 补丁注册表值异常还原问题解析

问题现象

  • 初始安装:部署由Wix 4构建的应用,其中包含注册表项MyComments,值为XXX
  • 补丁A安装:正常将MyComments值修改为YYY
  • 补丁B安装:仅修改其他文件组件,未改动该注册表项,但安装完成后MyComments被还原为XXX
  • 特殊场景:若补丁B中主动将MyComments修改为ZZZ,则无异常
  • 临时解决方案:将包含该注册表的CMP_SetReg组件移至单独的Feature中,问题不再出现

原因解析

这个问题的本质是Windows Installer组件修复机制与Wix补丁PatchFamily的作用范围共同导致的:

  1. 注册表组件CMP_SetReg与被补丁B修改的文件组件同属Main Feature。当安装补丁B时,Windows Installer会校验该Feature下所有组件的版本一致性。由于补丁B的PatchFamily未包含CMP_SetReg,Installer判定该组件的当前版本(被补丁A修改后的版本)与补丁B对应的基线版本不匹配,触发自动修复,将组件恢复到基线状态(即初始的XXX值)。
  2. 当把CMP_SetReg移至独立Feature后,补丁B的修改范围不涉及该Feature,Installer不会对这个Feature下的组件进行校验和修复,因此注册表值得以保留。
  3. 若补丁B的PatchFamily包含CMP_SetReg并更新值为ZZZ,Installer会将该组件升级到补丁B的版本,不会触发还原行为。

临时解决前的主安装包Wix代码

<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:ui="http://wixtoolset.org/schemas/v4/wxs/ui">
<Package        
        Name="App"      
        Language="1033"
        Version="2.0.0.8"
        Manufacturer="Develop"
        UpgradeCode="{E0EC963D-82A9-410E-93BA-11243A15E534}"
        InstallerVersion="500"
        ProductCode="{596EF69B-157C-4C02-A566-1ED06C68B67B}">
<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" />

<DirectoryRef Id="APPDIR">
 <Component Id="CMP_SetReg" Guid="{F0BD26A4-D356-4F17-BF60-4AC3EE7B820A}">      
  <RegistryValue Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[ProductCode]" Action="write" Name="MyComments" Type="string" Value="XXX" KeyPath="yes"/>
 </Component>
 <Component Id="CMP_fileA" Guid="1307a453-6683-479f-a1be-f0fdc0d22cd5">
  <File Id="FILE_fileA" Source="$(var.Path)..\app.exe" KeyPath="yes" />
 </Component>      
 .
 .
</DirectoryRef>
<Feature Id="Main" Display="hidden" Level="1" ConfigurableDirectory="APPDIR" Title="Main program" >  
  <ComponentRef Id="CMP_SetReg" />
  <ComponentRef Id="CMP_fileA" />
  .
  .
</Feature>
<Feature Id="Optional" Level="1" Title="Services">
  <Feature Id="Service1" Level="1" Title="Service1" >
    <ComponentRef Id="..." />
  </Feature>
  .
  .
</Feature>
<CustomAction Id=...
.
.
</Package>
</Wix>

补丁代码

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
  <Patch
    AllowRemoval="yes"
    Classification="Update"    
    DisplayName=".."
    Manufacturer=".."
    MoreInfoURL="..">

    <Media Id="1000" Cabinet="MyPatch.cab">
      <PatchBaseline
        Id="MyPatch"
        BaselineFile="Setup.wixpdb"
        UpdateFile="SetupNew.wixpdb" />
    </Media>

    <PatchFamily
      Id="MyPatchFamily"
      Version="2.0.0.9"      
      Supersede="yes">      
      <ComponentRef Id="..." />
      .
      .
    </PatchFamily>
  </Patch>
</Wix>

内容的提问来源于stack exchange,提问作者pumaikar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:27:06