Inno Setup - 卸载注册表删除选项

13

我正在为一个程序编写安装程序,它使用注册表项存储用户设置。目前,我已将其设置为在卸载程序时删除这些注册表文件,但我希望能够给用户提供选择保留或删除注册表文件的选项。

我不是最擅长脚本编写/编程的人,因此越简单的答案越好。

我的注册表/卸载当前看起来像这样。

    [Registry]
    Root: HKCU; Subkey: "Software\FFSPLIT Overlay Filter"; Flags: uninsdeletekey


    [UninstallDelete]  
    Type: filesandordirs; Name: "{app}\ffmpeg"
    Type: filesandordirs; Name: "{app}\OverlayData"
    Type: files; Name: "{app}\AForge.Controls.dll"
    Type: files; Name: "{app}\AForge.Imaging.dll"
    Type: files; Name: "{app}\AForge.Video.DirectShow.dll"
    Type: files; Name: "{app}\AForge.Video.dll"
    Type: files; Name: "{app}\AudioFilter.ax"
    Type: files; Name: "{app}\default.cfg"
    Type: files; Name: "{app}\DirectShowLib-2005.dll"
    Type: files; Name: "{app}\ffmpeg.exe"
    Type: files; Name: "{app}\FFSplit Overlay Filter.ax"
    Type: files; Name: "{app}\FFsplit.exe"
    Type: files; Name: "{app}\FFSplitOverlayManager.exe"
    Type: files; Name: "{app}\librtmp.dll"
    Type: files; Name: "{app}\msvcp100d.dll"
    Type: files; Name: "{app}\msvcr100d.dll"
    Type: files; Name: "{app}\NAudio.dll"
    Type: files; Name: "{app}\RegisterFilter.bat"
    Type: files; Name: "{app}\setting.cfg"
    Type: files; Name: "{app}\UNRegisterFilter.bat"
    Type: files; Name: "{app}\wavbuffer"
    Type: files; Name: "{app}\Micfilter.ax"

7
请注意,对于由[Files]条目安装的任何内容,您不需要使用[UninstallDelete]条目--它们默认情况下会被卸载。请注意保持原意并使翻译通俗易懂。 - Miral
1个回答

27

InnoSetup没有任何条件卸载检查参数,因此你需要自己进行处理。你需要移除 uninsdeletekey标志,这会自动删除注册表键,并在卸载过程结束时询问用户是否要以某种有意义的方式删除该键,并手动删除该键。下面的脚本在后卸载步骤执行,这是应用程序成功卸载的时间点。你可以参考注释版本

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

#define FilterRegKey "Software\FFSPLIT Overlay Filter"

[Registry]
Root: HKCU; Subkey: "{#FilterRegKey}"

[Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usPostUninstall then
  begin
    if RegKeyExists(HKEY_CURRENT_USER, '{#FilterRegKey}') then
      if MsgBox('Do you want to delete the overlay filter registry key ?',
        mbConfirmation, MB_YESNO) = IDYES
      then
        RegDeleteKeyIncludingSubkeys(HKEY_CURRENT_USER, '{#FilterRegKey}');
  end;
end;

1
谢谢,我真的很感激。这让我省了不少麻烦,我会从现在开始参考这个的。 - user1706975
2
请注意,这最多只会从一个用户中删除密钥。如果应用程序是按计算机安装的,并且有多个用户运行它,则设置将保留所有用户的设置,但不包括运行卸载程序的用户。如果这让您感到困扰,除了使您的安装程序成为每个用户 (PrivilegesRequired=lowest),否则没有解决方案,这反过来会对您可以安装的位置和可以使用的标志施加限制。 - Miral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接