Inno Setup - 即使取消删除键如何保留注册表

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

令人烦恼的是,我在应用程序中指定了“卸载删除密钥”标志:

Root: "HKA"; Subkey: "Software\Company\Application"; Flags: uninsdeletekey

类似问题:

第二个问题与我的问题更相关。但我无法按照答案中的建议修改任何卸载程序。

这样已经20年了!但我现在为同一个程序创建了两个安装程序。一个分别适用于 32/64,在安装过程中,他们删除了旧的应用程序。

好的方面是,不会丢失用户数据。一旦崩溃,注册表中的所有数据都会丢失。我查看了卸载程序的命令行开关,似乎没有什么可以阻止这种情况发生。

目前我能想到的唯一解决方案是:

  1. 运行定制工具以使用原始用户帐户提取密钥。
  2. 卸载旧应用程序。
  3. 安装新应用程序。
  4. 也运行定制以使用原始用户帐户重新导入密钥。

我是在重新发明轮子吗?我想看看是否有一个现有的优雅的解决方案来解决这个问题。

如果我不这样做,所有设置仍然会在那里。


我偶然发现了这个问题:

在其中一个答案中,它提到使用

reg.exe
导出密钥。所以我现在更新的想法是:

  1. 如果可能,请使用原始用户帐户运行
    reg.exe
    来创建文件。
  2. 卸载
  3. 安装
  4. 当应用程序启动时查找此文件是否存在(如果存在),请使用
    reg.exe
    导入它。

要么编写我自己的工具来执行相同的操作。


我确认第一步有效:

ExecAsOriginalUser(ExpandConstant('{sys}\reg.exe'), \
    'export "HKEY_CURRENT_USER\Software\Company\Application" "d:\test.txt"', \
    '', SW_HIDE, ewWaitUntilTerminated, ExportRegResult);
    Log(SysErrorMessage(ExportRegResult));

但我用

d:\test.txt
对其进行了硬编码。我不知道如何获取临时文件名,以便我们在安装结束时将其复制到用户数据文件夹中。

registry inno-setup uninstallation
1个回答
2
投票

Imo,这是最好的解决方案(或者不要运行旧的卸载程序)


要获取临时文件夹的路径,临时存储注册表,请使用

{tmp}
常量:

ExpandConstant('{tmp}\backup.reg')

此外,

ExecAsOriginalUser
HKEY_CURRENT_USER
与旧(卸载)安装程序中的
HKA
Registry
条目不匹配。

我认为你应该:

  • 使用
    Exec
    – 以相同的权限并在旧(卸载)安装程序运行的同一帐户下运行
    reg
  • HKEY_LOCAL_MACHINE
     为 true 时使用 
    IsAdminInstallMode
    – 匹配
    HKA
    行为。

有关 Inno Setup 中

reg.exe
错误处理的一些示例,请参阅:
在 Inno Setup 中为登录用户(非管理员用户)创建注册表项

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