2011-03-30 105 views
13

我想读HKLM \ SOFTWARE \微软\的Windows \ CurrentVersion \ Run中OpenKeyReadOnly,并且GetValueNames,但它返回从HKLM \ SOFTWARE值\ Wow6432Node \微软\的Windows \ CurrentVersion \ Run中代替。32位程序如何读取注册表的“真实”64位版本?

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

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

我使用德尔福2010年

回答

21

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

从MSDN:

KEY_WOW64_64KEY表明,对64位Windows的应用程序 应该 在64位注册表视图操作。 此标志被Windows 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. 
+0

+1完美的答案:-) – 2011-03-31 05:50:48

+0

AFAIK这个例子是错误的,因为OpenKeyReadOnly将重置Access属性没有KEY_WOW64_64KEY到KEY_READ。所以你仍然在阅读32位版本。也许后来的Delphi版本保留KEY_WOW64_64KEY,但我无法检查。 – 2011-03-31 06:58:51

+0

感谢您的回答和问题编辑,在我英语不好的同时... 已找到依然:Reg.Access:= KEY_WOW64_64KEY或KEY_ALL_ACCESS; – 2011-03-31 11:03:31