Delphi在Windows 7 x64上读取注册表

时间:2013-05-23 10:58:35

标签: delphi registry delphi-7 windows-7-x64

我在注册表中有价值(Windows 7 x64):

[HKEY_CLASSES_ROOT\.html]
@="ChromeHTML"

然后我通过Delphi 7上的ServiceApplication阅读:

Reg := TRegistry.Create(KEY_ALL_ACCESS or KEY_WOW64_32KEY);
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;

    Reg.OpenKey('.html', False);
    Default := Reg.ReadString('');

我的htmlfile变量中有Default

我怎样才能获得正确的价值?

ps:destop应用程序中的相同代码读取正确的值。

1 个答案:

答案 0 :(得分:3)

HKEY_LOCAL_MACHINE\Software\ClassesHKEY_CURRENT_USER\Software\Classes个键的{p> HKEY_CLASSES_ROOT is a merged view,其中HKCU中的值优先于HKLM中的相应值。默认情况下,服务不会与桌面应用程序在同一用户帐户中运行。因此,对于服务实际运行的用户帐户,该用户的htmlfile密钥中存在HKCUHKCU中不存在值,但htmlfile中确实存在HKLM而是ImpersonateLoggedOnUser()键。

为了使服务能够看到桌面应用程序看到的相同数据,该服务必须以同一用户身份访问注册表。你需要:

  1. 将SCM中的服务配置为以该用户帐户运行。

  2. 让服务使用HKEY_CLASSES_ROOT或类似功能动态模拟用户帐户,然后正常打开该用户的LogonUser()密钥。

  3. 让服务动态获取用户帐户的令牌,例如来自OpenProcessToken()HKEY_CLASSES_ROOT,然后使用LoadUserProfile()RegOpenUserClassesRoot()功能访问该用户的{{1}}密钥。