2011-03-30 119 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

相關問題