Inno setup 通过[代码]指定注册表卸载项位置/配置单元

Inno setup 通过[代码]指定注册表卸载项位置/配置单元,inno-setup,Inno Setup,Inno Setup默认情况下查看PrivilegesRequired设置变量,如果该变量设置为admin或poweruser,安装程序将卸载注册表项安装到HKLM。如果设置为lower,则会将注册表项安装到HKCU 我需要为用户提供一个选项来安装“just me”或“Everyone”,并用这两个选项中的一个radio选项替换dir选择页面。我现在需要做的是根据此设置修改注册表安装位置。如果我将应用程序安装到本地用户应用程序数据中,则在HKLM级别注册卸载数据是没有意义的,因为这样其他用户将在

Inno Setup默认情况下查看
PrivilegesRequired
设置变量,如果该变量设置为
admin
poweruser
,安装程序将卸载注册表项安装到
HKLM
。如果设置为
lower
,则会将注册表项安装到
HKCU

我需要为用户提供一个选项来安装“just me”或“Everyone”,并用这两个选项中的一个radio选项替换dir选择页面。我现在需要做的是根据此设置修改注册表安装位置。如果我将应用程序安装到本地用户应用程序数据中,则在
HKLM
级别注册卸载数据是没有意义的,因为这样其他用户将在程序列表中看到它,并且仍然无法卸载或使用它

编辑:在查看文档和
Install.pas
的源代码后,我找到了
CreateUninstallRegKey
setup指令,该指令将禁止Inno安装注册表项,之后我可以添加自己的注册表项,但这真的是唯一的方法吗


编辑#2(标记为重复):我已经研究了这个问题(并实际实现了它),它与我的问题不同。当前提升状态不会改变Inno Setup实际保存卸载注册表信息的位置(在HKCU或HKLM中)。如果查看,您将看到
PrivilegesRequired
指令是注册表存储位置的主要因素。如果设置为
lower
,则安装程序是否提升并不重要-它会将注册表项安装到HKCU,此时所需的行为是根据用户安装首选项而不是当前提升状态选择其中一个。综上所述,我正在寻找一种基于代码变量改变注册表根的解决方案,而不考虑当前的PrivilegesRequired或Elevation设置。

Inno Setup 6内置了对的支持

基本上,您可以简单地设置:


对于Inno设置5:正如您所发现的,逻辑是硬编码的。你真的无法控制

最接近的方法是使用未记录(不推荐)的
PrivilegesRequired=none

使用此值(并借助Windows中的安装程序自动检测):

  • 当您使用非特权帐户启动安装程序时,它将在不提示您升级的情况下启动。如果您决定在安装过程中需要提升,您可以
  • 当您使用特权帐户启动安装程序时,它总是提示您提升,如果您拒绝提升,则不会启动。所以安装程序总是运行在高位。同样,如果决定不升级继续,则必须重新启动安装程序。看看,也许吧
这不完全是你想要的,但我认为你不能再靠近了


当然,您可以通过代码在
HKCU
HKLM
之间复制(移动)注册表项:

函数MoveHKCUUninstallKeyToHKLM:Boolean;
变量
卸载键:字符串;
AppId:字符串;
I:整数;
值名称:TArrayOfString;
ValueName:字符串;
ValueStr:字符串;
价值观:红衣主教;
开始
如果“{#emit SetupSetting(“AppId”)}”,则
开始
AppId:='{#emit SetupSetting(“AppId”)}';
结束
其他的
开始
AppId:='{#emit SetupSetting(“AppName”)}';
结束;
结果:=假;
如果AppId='',则
开始
日志('无法识别AppId');
结束
其他的
开始
卸载密钥:=
'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+AppId+''u is1';
日志(格式)(
'使用卸载密钥“%s”标识为“%s”的AppId,[AppId,UninstallKey]);
如果不存在注册表项(HKCU,卸载注册表项),则
开始
日志(“未找到HKCU卸载密钥”);
结束
其他的
如果存在注册表项(HKLM,卸载注册表项),则
开始
日志(“HKLM卸载密钥已存在”);
结束
其他的
开始
日志(“找到HKCU卸载密钥,但HKLM密钥不存在”);
如果不是RegGetValueNames(HKCU、UninstallKey、ValueNames),则
开始
日志('无法列出卸载键值');
结束
其他的
开始
I:=0;
结果:=真;
而(I[Setup]
PrivilegesRequiredOverridesAllowed=commandline dialog