Inno Setup - 注册表 uninsdeletekey - 排除升级

Posted

技术标签:

【中文标题】Inno Setup - 注册表 uninsdeletekey - 排除升级【英文标题】:Inno Setup - Registry uninsdeletekey - exclude upgrade 【发布时间】:2015-02-02 01:38:07 【问题描述】:

我有一个 Inno-Setup 安装,在 [Registry] 部分中有以下条目

Root: HKCU; Subkey: SOFTWARE\MyCompany\MyApp; ValueName: MyKey; Flags: uninsdeletekey noerror

标志所述,卸载时将被删除。

但是我需要保留它,以防卸载是由于版本升级。

怎么做? Check 可能吗?

谢谢。

【问题讨论】:

所以你在安装新版本的时候卸载了以前的版本,你想保留那个密钥,对吗? 是的。没错。 嗯,那么我们需要将此信息(有人想要有条件地保留密钥)传递给卸载程序,因为它不知道是谁执行它。 这是我问的。我如何获得这些信息,以及如何传递它? 最后一件事。你说的是升级,真的是升级吗?不只是更新?你不是这里人们所说的***.com/q/2000296/960757 的受害者吗? 更新设置保持相同的AppId,并且您不必卸载已安装的版本(仅在极端情况下)。升级设置的AppId 与以前版本的设置不同。这是哪一个?你甚至需要卸载以前的版本? 【参考方案1】:

您需要将要保留密钥的信息传递给卸载程序,因为它不知道是谁执行它(好吧,如果您以编程方式找到父进程,则无需显式传递此信息,但这是一种相当老套的方式)。

一个可靠的解决方案是通过命令行参数告诉卸载程序。以下示例显示了一种卸载程序的实现,它会有条件地删除注册表项:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName=pf\My Program

#define MyAppRegKey "SOFTWARE\MyCompany\MyApp"

[Registry]
; no uninsdeletekey flag must be used here
Root: HKCU; Subkey: "#MyAppRegKey"; Flags: noerror
Root: HKCU; Subkey: "#MyAppRegKey"; ValueType: string; ValueName: "MyKey"; ValueData: "MyValue"; Flags: noerror

[Code]
function CmdLineParamExists(const Value: string): Boolean;
var
  I: Integer;  
begin
  Result := False;
  for I := 1 to ParamCount do
    if CompareText(ParamStr(I), Value) = 0 then
    begin
      Result := True;
      Exit;
    end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  // if we are at the post uninstall step and the uninstaller wasn't executed with
  // the /PRESERVEREGKEY parameter, delete the key and all of its subkeys (here is
  // no error handling used, as your original script ignores all the errors by the
  // noerror flag as well)
  if (CurUninstallStep = usPostUninstall) and not CmdLineParamExists('/PRESERVEREGKEY') then
    RegDeleteKeyIncludingSubkeys(HKCU, '#MyAppRegKey');
end;

如果您使用 /PRESERVEREGKEY 命令行参数运行此类设置的 unistaller,则注册表项将被保留,否则将被删除,例如:

unins000.exe /PRESERVEREGKEY

但除了您在两个不同的应用程序之间共享注册表项之外,我想不出上述的真正用法。由不同设置安装的应用程序(例如具有不同 AppId 的设置)。

请注意,在进行更新时无需卸载以前版本的应用程序(以防您使用相同的AppId 安装新版本的设置)。如果您遵循此规则,Inno Setup 将执行更新并保留您的注册表项,直到您卸载应用程序。

【讨论】:

以上是关于Inno Setup - 注册表 uninsdeletekey - 排除升级的主要内容,如果未能解决你的问题,请参考以下文章

inno setup 开机启动

Inno Setup 不允许访问所有注册表项,为啥?

inno setup如何做快速启动栏?

inno setup打包的安装文件更换位置后图标改变了

Inno Setup 5 安装包制作!reg2iss,Inno Setup 问题。Inno Setup 怎么批量导入reg文件,(像nsis

如何使用 Inno Setup pascal 脚本从注册表中读取 MachineGuid