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

WiX v5下卸载HF3后如何保持HF1、HF2在控制面板隐藏?

问题:卸载HF3后HF1、HF2重新显示的解决方法

背景

基础RTM版本部署后,依次安装HF1、HF2、HF3三个热修复。安装HF3后,通过在InstallFinalize前后执行自定义操作,将HF1、HF2的SystemComponent注册表值设为1,实现这两个热修复在控制面板「程序和功能」中隐藏,仅显示RTM和HF3,安装流程符合预期。

但卸载HF3时出现异常:HF1、HF2重新在控制面板中显示。排查发现,自定义操作已将SystemComponent值正确设为0,但该值随后被删除,导致隐藏条目重新出现,不符合需求。使用WiX v5开发。

自定义操作代码片段:

<CustomAction Id="HideHotFixes"
Execute="" -> Tried with immediate, commit and deferred type of custom actions
DllEntry="HideandUnhideHotFixes"
Impersonate="no"
BinaryRef="MBACAs" />

解决方法

  • 直接设置目标值而非0:卸载HF3的核心需求是保持HF1、HF2隐藏,因此无需将SystemComponent设为0,直接在卸载流程中执行自定义操作,将HF1、HF2的SystemComponent值强制设为1,覆盖任何中间修改。
  • 用WiX RegistryValue持久化注册表项:在HF3的WiX项目中,为HF1、HF2对应的卸载注册表项添加RegistryValue元素,标记为永久,避免Windows Installer卸载时删除该值:
    <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[HF1_PRODUCT_CODE]">
      <RegistryValue Name="SystemComponent" Type="integer" Value="1" Permanent="yes" />
    </RegistryKey>
    <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[HF2_PRODUCT_CODE]">
      <RegistryValue Name="SystemComponent" Type="integer" Value="1" Permanent="yes" />
    </RegistryKey>
    
    替换[HF1_PRODUCT_CODE]和[HF2_PRODUCT_CODE]为对应热修复的实际产品代码。
  • 调整自定义操作执行时机:将自定义操作设置为deferred类型,放在RemoveFiles之后、InstallFinalize之前执行,确保在Windows Installer处理注册表删除操作之后修改值,避免被覆盖。同时在自定义操作中直接调用Windows API修改注册表(如RegSetValueEx),不依赖WiX的注册表表。
  • 让HF1、HF2自身设置永久隐藏:修改HF1、HF2的安装包,在安装时就将自身的SystemComponent设为1并标记Permanent="yes",这样后续HF3的修改不会影响该值的持久性,卸载HF3时也不会触发该值的删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 14:40:00