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

通过NSIS添加控制面板卸载项时注册表键未写入的问题

问题:NSIS安装程序未在注册表中写入卸载项信息

我正在使用NSIS为应用程序制作安装/卸载程序,希望在控制面板的「添加/删除程序」列表中创建卸载项。参考相关步骤并考虑64位系统的注册表视图设置后,编写了如下代码:

Section "" 

SetOutPath $INSTDIR
File /r  appfiles\

${If} ${RunningX64} 
  SetRegView 64
${Else}
  SetRegView 32
${Endif}
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aplicacion" "DisplayName" 
"Desinstalar Aplicación"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aplicacion" 
"UninstallString" "$\"$INSTDIR\uninstall.exe$\""
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aplicacion" "DisplayIcon" 
"$\"$INSTDIR\appfiles\Resources\logo.jfif$\""

WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aplicacion" "NoModify" 1
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aplicacion" "NoRepair" 1
SetRegView lastused
WriteUninstaller "$INSTDIR\uninstall.exe"  

SectionEnd

但运行安装程序后,通过regedit.exe查看对应注册表项,发现未写入任何内容,请问遗漏或操作错误的地方是什么?


问题排查与解决

1. 命令参数跨行导致语法错误

你的代码中,WriteRegStr命令的最后一个参数(字符串值)被拆分成了两行,比如:

WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aplicacion" "DisplayName" 
"Desinstalar Aplicación"

NSIS不允许命令参数跨行拆分,这会导致命令缺少必要的参数值,无法执行注册表写入操作。需要把参数放在同一行:

WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aplicacion" "DisplayName" "Desinstalar Aplicación"

同理修正UninstallString和DisplayIcon对应的WriteRegStr命令。

2. 缺少管理员权限

写入HKLM(本地机器)注册表项需要管理员权限,NSIS默认以普通用户权限运行,会导致注册表写入失败。需要在脚本开头添加以下代码,请求管理员权限:

RequestExecutionLevel admin

3. 额外验证点

  • 确认${RunningX64}宏已正确引入,需在脚本开头包含x64.nsh头文件:
    !include x64.nsh
    
  • 检查安装程序运行时是否弹出UAC提示,如果没有,说明权限请求未生效,需确认RequestExecutionLevel设置正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:27:25