Подтвердить что ты не робот

Как 32-разрядная программа может читать "настоящую" 64-разрядную версию реестра?

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

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

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

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

4b9b3361

Ответ 1

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

из MSDN:

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

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

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

{$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.