32位程序如何读取"真正的"64位版本的注册表?

Gu.*_*u. 15 delphi registry delphi-2010

我正在尝试阅读HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run with OpenKeyReadOnly,GetValueNames但它会从HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run返回值.

如何读取64位值而不是重定向到32位密钥?

该程序作为管理帐户运行.我也试过RegOpenKeyExRegEnumValue.

我正在使用Delphi 2010.

RRU*_*RUZ 25

在使用类KEY_WOW64_64KEY打开注册表时必须使用该值TRegistry.

来自MSDN:

KEY_WOW64_64KEY 表示64位Windows上的应用程序应在64位注册表视图上运行.32位Windows会忽略此标志.

必须使用OR运算符将此标志与此表中查询或访问注册表值的其他标志组合在一起.

试试这个示例应用.

{$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.
Run Code Online (Sandbox Code Playgroud)

  • AFAIK 这个示例是错误的,因为 OpenKeyReadOnly 会将 Access 属性重置为 KEY_READ 而无需 KEY_WOW64_64KEY。所以您仍在阅读 32 位版本。也许更高版本的 Delphi 会保留 KEY_WOW64_64KEY,但我无法检查。 (2认同)
  • @TheFox,我在 Windows 7 64 位下的 delphi 2007 和 delphi XE 中测试了代码,并且在两个版本中都可以正常工作。 (2认同)