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を使用しないのですか?あなたのロジックも本当に混乱しています。関数を呼び出して値を読み取る必要があります。それを2回呼ぶ。最初のパス0。2回目のパスはKEY_WOW64_64KEYです。最初の時間が失敗した場合にのみ、2回目を呼び出します。これは、メソッドのリファクタリングを抽出します。 –
以前はTRegistryを使っていましたが、KEY_WOW64_64KEYをコンストラクタを介してパラメータで追加することはできませんでした。 –
確かにそうです。私の答えを見てください。編集:今私の答えを見つけたように見えます。また、 'Access'プロパティはいつでも変更でき、既に作成されたレジストリオブジェクト内のビューを切り替えることができます。 –