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\ClassesはとHKEY_CURRENT_USER\Software\Classesキーの結合ビューであり、に存在HKCUする値は に存在する対応する値よりも優先されHKLMます。デフォルトでは、サービスはデスクトップ アプリと同じユーザー アカウントでは実行されません。そのため、サービスが実際に実行されているユーザー アカウントについてはhtmlfile、そのユーザーのHKCUキーに存在するか、値が存在しないHKCU代わりにキーにhtmlfile存在します。HKLM

サービスがデスクトップ アプリと同じデータを表示するには、サービスが同じユーザーとしてレジストリにアクセスする必要があります。次のいずれかを行う必要があります。

  1. そのユーザー アカウントとして実行するように SCM でサービスを構成します。

  2. または同様の機能を使用してサービスにユーザーアカウントを動的に偽装させ、そのユーザーのキーを通常どおりImpersonateLoggedOnUser()に開きます。HKEY_CLASSES_ROOT

  3. LogonUser()またはなどからユーザー アカウントへのトークンを動的に取得しOpenProcessToken()LoadUserProfile()およびRegOpenUserClassesRoot()関数を使用してそのユーザーのHKEY_CLASSES_ROOTキーにアクセスします。

于 2013-05-23T16:51:00.737 に答える