4

我的旧应用程序写入注册表(最终被虚拟化),现在我希望安装程序实际读取这些数据,当我直接从 LOCAL_MACHINE 尝试时(我不知道密钥被虚拟化)我得到了错误,然后当我决定尝试直接从虚拟化密钥读取,我也得到了错误。

Windows 2008 服务器 64 位,我的应用程序是 32 位,启用了 UAC。

那么实际上可以直接从虚拟化的 Windows 注册表中读取吗?

现在我需要读取这些数据,但是。

这行不通。

  if regkeyexists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\Company\App') then
  begin
    msgBox('Exists', mbinformation, mb_ok);
  end else begin
    msgBox('Doesnt exists', mbinformation, mb_ok);
  end;

这也行不通。

  if regkeyexists(HKEY_CURRENT_USER, 'Software\Classes\VirtualStore\MACHINE\SOFTWARE\Wow6432Node\Company\App') then
  begin
    msgBox('Exists', mbinformation, mb_ok);
  end else begin
    msgBox('Doesnt exists', mbinformation, mb_ok);
  end;

它说密钥不存在

所以现在我实际上无法读取数据?我检查过了,路径没问题。

4

2 回答 2

3

虚拟化密钥是每个用户的数据;这意味着即使您能够从安装程序中成功读取一个,您也只会读取一个用户的设置,而不是所有用户的设置(正如您所发现的,您很有可能甚至无法读取读那个)。

通常你可以忽略虚拟化,直到升级你的应用程序并用兼容性清单标记它,此时它会失去虚拟化,你必须正确处理注册表。所以我假设这是你发现自己的情况。

在这种情况下,正确的分辨率不在安装程序中,而是在您的应用程序中。您的安装程序根本不应该写入注册表,或者应该在 HKLM 中存储只读默认值。启动时,您的应用程序应首先尝试按此顺序从位置读取设置(如果无法在列表中找到值,则仅向下移动):

  1. HKCU\Software\YourCompany\YourApp\SettingName
  2. 您之前错误使用的 HKLM 密钥的 VirtualStore 位置
  3. 可能由安装程序编写的 HKLM 密钥
  4. 一些内部默认值

当您的应用程序保存设置时,它必须只写入#1,绝不能写入其他任何地方。另请注意,您必须针对每个单独的设置遵循此列表 - 可能某些设置在 HKCU 中,有些是虚拟化的,有些仅在 HKLM 中。

于 2013-10-18T22:26:10.703 回答
2

我可以使用一些解决方法来解决我的问题,以便让其他人知道以防其他人需要它。

发生的事情是,即使是管理员用户,在启用 UAC 的 Windows 2008 服务器中,我的应用程序(未以管理员身份运行)用于将其注册表记录在虚拟化密钥中,而 Inno Setup 中的安装可以写入真正的 LOCAL_MACHINE ,使应用程序的注册表对我的应用程序不可见,反之亦然。

当我发布一个新版本时,我必须确保应用程序注册表位于 LOCAL_MACHINE 中,我使用“ShellExecAsOriginalUser”运行了一个单独的应用程序,将虚拟化密钥实际导出到文件,然后通过 Inno 导入回 LOCAL_MACHINE设置。

我很感谢这里的所有答案!

于 2013-10-22T11:04:57.647 回答