Как 32-разрядная программа может прочитать «настоящую» 64-разрядную версию реестра? - PullRequest
15 голосов
/ 31 марта 2011

Я пытаюсь прочитать HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run с OpenKeyReadOnly и GetValueNames, но он возвращает значения из HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Run вместо.

Как можно прочитать 64-разрядные значения вместо перенаправления на 32-разрядный ключ?

Программа была запущена от имени администратора.Я также пытался RegOpenKeyEx и RegEnumValue.

Я использую Delphi 2010.

1 Ответ

25 голосов
/ 31 марта 2011

вы должны использовать значение KEY_WOW64_64KEY при открытии реестра с классом TRegistry.

из MSDN:

KEY_WOW64_64KEY Указывает, что приложение в 64-битной Windows должно работать в 64-битном представлении реестра.Этот флаг игнорируется 32-битной Windows.

Этот флаг должен быть объединен с помощью оператора ИЛИ с другими флагами в этой таблице, которые запрашивают или обращаются к значениям реестра.

попробуйте этот пример приложения.

{$APPTYPE CONSOLE}

uses
  Windows,
  Classes,
  registry,
  SysUtils;


procedure ReadRegistry;
var
  Registry: TRegistry;
  List    : TStrings;
begin
  Registry := TRegistry.Create(KEY_WRITE OR KEY_WOW64_64KEY);
  //Registry := TRegistry.Create(KEY_READ OR KEY_WOW64_64KEY);
  List     := TStringList.Create;
  try
    Registry.RootKey := HKEY_LOCAL_MACHINE;
    if Registry.OpenKeyReadOnly('\SOFTWARE\Microsoft\Windows\CurrentVersion\Run') then
    begin
       Registry.GetValueNames(List);
       Writeln(List.Text);
    end;
    Registry.CloseKey;
  finally
    Registry.Free;
    List.Free;
  end;
end;

begin
  try
   ReadRegistry();
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
  Readln;
end.
...