我一直在使用來自HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography
的密鑰MachineGuid
的值來唯一標識主機,但是使用在64位計算機上運行的32位進程的值似乎丟失了。我想它是在Wow6432Node下搜索的,它確實缺少。根據this你應該能夠通過添加一個標誌,以獲得正確的關鍵,但下面的代碼仍然沒有出現工作。我錯過了什麼?如何從32位進程讀取64位註冊表項?
const
KEY_WOW64_64KEY=$0100;
var
r:HKEY;
s:string;
i,l:integer;
begin
//use cryptography machineguid, keep a local copy of this in initialization?
l:=40;
if RegOpenKeyEx(HKEY_LOCAL_MACHINE,PChar('Software\Microsoft\Cryptography'),
0,KEY_QUERY_VALUE,r)=ERROR_SUCCESS then
begin
SetLength(s,l);
if RegQueryValue(r,'MachineGuid',PChar(s),l)=ERROR_SUCCESS then
begin
SetLength(s,l);
RegCloseKey(r);
end
else
begin
//try from-32-to-64
RegCloseKey(r);
if RegOpenKeyEx(HKEY_LOCAL_MACHINE,PChar('Software\Microsoft\Cryptography'),
0,KEY_QUERY_VALUE or KEY_WOW64_64KEY,r)=ERROR_SUCCESS then
begin
l:=40;
if RegQueryValue(r,'MachineGuid',PChar(s),l)=ERROR_SUCCESS then
SetLength(s,l)
else
l:=0;
RegCloseKey(r);
end;
end;
end;
爲什麼不使用TRegistry?你的邏輯也是一團糟。你想要一個函數來調用來讀取值。稱它兩次。第一次通過0.第二次通過KEY_WOW64_64KEY。如果第一次失敗,只調用第二次。這是提取方法重構。 – 2012-02-02 22:59:26
我之前使用過TRegistry,但並不知道你通過帶參數的構造函數添加KEY_WOW64_64KEY。 – 2012-02-03 10:02:32
當然可以。看到我的答案。編輯:看起來你現在找到了我的答案。另請注意,您可以隨時修改'Access'屬性以在已創建的註冊表對象中切換視圖。 – 2012-02-03 10:07:41