Registry Inno Setup uninsdeletekey 但升级时未删除

问题描述 投票:0回答:1

我安装了 Inno Setup,并在

[Registry]
部分中包含以下条目

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

flags
所述,卸载时将被删除。

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

如何才能做到呢?

Check
也许?

谢谢。

installation registry inno-setup upgrade uninstallation
1个回答
0
投票

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

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

[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
命令行参数运行此类设置的卸载程序,则注册表项将被保留,否则将被删除,例如:

unins000.exe /PRESERVEREGKEY

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

AppId
的设置)。

请注意,在更新时无需卸载应用程序的先前版本(如果您使用相同的

AppId
安装新版本的设置)。如果您遵循此规则,Inno Setup 将执行更新,并且您的注册表项将被保留,直到您卸载该应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.