0

我在注册表中有价值(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 应用程序中的相同代码读取正确的值。

4

1 回答 1

3

HKEY_CLASSES_ROOTHKEY_LOCAL_MACHINE\Software\ClassesHKEY_CURRENT_USER\Software\Classes的合并视图HKCU,其中存在的值优先于存在于 中的对应值HKLM。默认情况下,服务不会在与桌面应用程序相同的用户帐户中运行。因此,对于实际运行服务的用户帐户,要么htmlfile存在于该用户的HKCU密钥中,要么不存在值HKCUhtmlfile确实存在于HKLM密钥中。

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

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

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

  3. 让服务动态获取用户帐户的令牌,例如 fromLogonUser()OpenProcessToken(),然后使用LoadUserProfile()andRegOpenUserClassesRoot()函数访问该用户的HKEY_CLASSES_ROOT密钥。

于 2013-05-23T16:51:00.737 回答