从虚拟化Windowsregistry中读取密钥

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

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

那么实际上是否可以直接从虚拟化的Windowsregistry中读取?

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

这不起作用。

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; 

它说密钥不存在

那么现在我实际上无法读取数据? 我已经检查过了,path还行。

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

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

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

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

当您的应用程序保存设置时,它只能写入#1,绝不会在其他地方写入。 另外请注意,您必须按照这个列表中的每个设置 – 有可能是一些设置在HKCU,有些是虚拟的,有些只在HKLM。

我可以使用一些解决方法解决我的问题,所以只是为了让别人知道,以防其他人需要它。

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

当我发布一个新版本,我必须确保应用程序注册将在LOCAL_MACHINE,我运行一个分离的应用程序使用“ShellExecAsOriginalUser”实际导出虚拟化的密钥到一个文件,然后通过Inno导入到LOCAL_MACHINE建立。

我很感谢所有的答复!