我认为这个问题已被提出,但我找不到适用于我的解决方案。我在Windows 7旗舰版,64位下使用Delphi 7。实际上我开始在32位操作系统下编写应用程序,但随后更改了PC,所以现在更改为64.在我的程序中,我使用注册过程,从Windows的PROGID值生成许可证ID。不幸的是,它没有读取值,似乎它正在寻找一个不同的文件夹,可能被Windows 64重定向到32位注册表。你能帮我吗?这是我使用的代码:
Registry := TRegistry.Create(KEY_READ OR $0100);
try
Registry.Lazywrite := false;
Registry.RootKey := HKEY_LOCAL_MACHINE;
if CheckForWinNT = true then
Begin
if not Registry.OpenKeyReadOnly('\Software\Microsoft\Windows NT\CurrentVersion') then showmessagE('cant open');
end
else
Registry.OpenKeyReadOnly('\Software\Microsoft\Windows\CurrentVersion');
result := Registry.ReadString('ProductID');
Registry.CloseKey;
finally
Registry.Free;
end; // try..finally
另外,您知道如何在Delphi 7中查找程序是否在64位或32位计算机下运行吗?
答案 0 :(得分:12)
您已经问过这个问题,请参阅Registry ReadString method is not working in Windows 7 in Delphi 7。
所以你知道你必须在TRegistry.Create中添加$ 0100。您的代码的问题是您使用OpenKeyReadOnly将注册表的Access属性重置为KEY_READ,因此KEY_READ or $0100
将丢失。
只使用OpenKey而不是OpenKeyReadOnly,这不会重置您的Access属性。
答案 1 :(得分:9)
以下是一些Delphi 7代码,用于检测您是否在64位操作系统中运行:
function Is64BitOS: Boolean;
type
TIsWow64Process = function(Handle:THandle; var IsWow64 : BOOL) : BOOL; stdcall;
var
hKernel32 : Integer;
IsWow64Process : TIsWow64Process;
IsWow64 : BOOL;
begin
// we can check if the operating system is 64-bit by checking whether
// we are running under Wow64 (we are 32-bit code). We must check if this
// function is implemented before we call it, because some older versions
// of kernel32.dll (eg. Windows 2000) don't know about it.
// see http://msdn.microsoft.com/en-us/library/ms684139%28VS.85%29.aspx
Result := False;
hKernel32 := LoadLibrary('kernel32.dll');
if (hKernel32 = 0) then RaiseLastOSError;
@IsWow64Process := GetProcAddress(hkernel32, 'IsWow64Process');
if Assigned(IsWow64Process) then begin
IsWow64 := False;
if (IsWow64Process(GetCurrentProcess, IsWow64)) then begin
Result := IsWow64;
end
else RaiseLastOSError;
end;
FreeLibrary(hKernel32);
end;
(无耻地剽窃自己,here)
看起来您正在传递KEY_WOW64_64KEY($ 0100),因此您应该查看64位注册表分支。如果要查看32位注册表分支,则应传递KEY_WOW64_32KEY($ 0200)。
答案 2 :(得分:1)
关于你的问题,无论是64位计算机(与在64位操作系统上运行的计算机都不一样),请查看this question的答案。
答案 3 :(得分:1)
我知道这个主题是关于delphi 7的,但我认为我在阅读注册表时遇到了问题并来到这里学习..我最终使用的是Key_Read而不是这里建议的所有额外内容。
我正在使用Delphi 2010,我使用Key_Read就好了。
以下是我的部分内容有效:
//Search registry
reg:=TRegistry.Create(KEY_READ);
with reg do begin
try
RootKey := HKEY_LOCAL_MACHINE;
if OpenKey('\SOFTWARE\Wow6432Node\Blizzard Entertainment\World of Warcraft',false) then
begin
memo.Lines.Add('HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Blizzard Entertainment\World of Warcraft - exists');
wowdir1 := readstring('InstallPath');
memo.Lines.Add('InstallPath - ' + wowdir1);
newline;
closekey;
end;
if OpenKey('\SOFTWARE\Wow6432Node\Blizzard Entertainment\World of Warcraft',false) then
begin
memo.Lines.Add('HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Blizzard Entertainment\World of Warcraft - exists');
wowdir2 := readstring('GamePath');
memo.Lines.Add('GamePath - ' + wowdir2);
newline;
wowdir1 := readstring('');
closekey;
end;
if OpenKey('\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\World of Warcraft',false) then
begin
memo.Lines.Add'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\World of Warcraft - exists');
wowdir3 := readstring('InstallLocation');
memo.Lines.Add('InstallLocation - ' + wowdir3);
newline;
wowdir1 := readstring('');
closekey;
end;
finally
reg.Free;
end;
我尝试了此处显示的其他键,发现我不需要KEY_WOW64_64KEY或KEY_WOW64_32KEY。这一定是Delphi 2010中已经纠正过的错误。