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

时间:2011-03-30 22:36:15

标签: delphi delphi-2010 registry

我正在尝试使用OpenKeyReadOnlyGetValueNames读取 HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run ,但它正在从 HKLM返回值\ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Run

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

该程序作为管理帐户运行。我还尝试了RegOpenKeyExRegEnumValue

我正在使用Delphi 2010。

1 个答案:

答案 0 :(得分:25)

使用KEY_WOW64_64KEY类打开注册表时,必须使用TRegistry值。

来自MSDN的

  

KEY_WOW64_64KEY 表示一个   应用程序在64位Windows上应该   在64位注册表视图上运行。   该标志被32位忽略   视窗。

     

此标志必须使用   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.