Wow64-32Node
64 bitlik Windows 2003 yada 2008 sunucunuzda 32 bit derlediğiniz yazılımlarınızın register kayıtlarını okumada problem yaşayabilirsiniz. Bunun nedeni 64 bitlik sistem 32 bitlik erişim için Wow6432Node adında bir anahtar açar ve 32 bitlik yazılımlar verilen anahtara değil Wow6432Node altındaki anahtara erişirler.
Örneğin HKEY_CURRENT_USER\SOFTWARE\Classes anahtarını açtınız. Yazılımınız 32 bitlik ise SOFTWARE altında Wow6432 altındaki Classes bölümünü açmış olursunuz. Bunu engellemek gerçek olanını açabilmek için RegOpenKeyEx deki erişim parametresine WOW64_64Key (0x0100) eklemek gereklidir.
C++ için register erişimi alttaki gibi yapılmalıdır.
LONG nRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
L"SOFTWARE\\Classes",
0,
KEY_READ | KEY_WOW64_64KEY, // For 32 bit exe running on 64 bit windows
&hKey);
Aynı işlemi Delphi dilinde gerçekleştirmek için.
var r:TRegistry;
begin
r:=TRegistry.Create;
try
r.RootKey:=HKEY_LOCAL_MACHINE;
r.Access:=r.Access + 256; //64 bitlik windows erişimi için 256 ekleniyor
r.OpenKey('SOFTWARE\Classes',True);
result:=r.ReadString('TestKey');
r.CloseKey;
finally
r.free;
end;
end;
Aslında yazılım kendi bir takım register anahtarları açıp okuyor ise problem oluşmuyor. Ancak hem .NET yazılımınız hemde diğer 32bitlik yazılımınız. Register kayıtlarına erişmesi gerektiği durumlarda bu problem ortaya çıkıyor.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072(v=vs.85).aspx
Örneğin HKEY_CURRENT_USER\SOFTWARE\Classes anahtarını açtınız. Yazılımınız 32 bitlik ise SOFTWARE altında Wow6432 altındaki Classes bölümünü açmış olursunuz. Bunu engellemek gerçek olanını açabilmek için RegOpenKeyEx deki erişim parametresine WOW64_64Key (0x0100) eklemek gereklidir.
C++ için register erişimi alttaki gibi yapılmalıdır.
LONG nRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
L"SOFTWARE\\Classes",
0,
KEY_READ | KEY_WOW64_64KEY, // For 32 bit exe running on 64 bit windows
&hKey);
Aynı işlemi Delphi dilinde gerçekleştirmek için.
var r:TRegistry;
begin
r:=TRegistry.Create;
try
r.RootKey:=HKEY_LOCAL_MACHINE;
r.Access:=r.Access + 256; //64 bitlik windows erişimi için 256 ekleniyor
r.OpenKey('SOFTWARE\Classes',True);
result:=r.ReadString('TestKey');
r.CloseKey;
finally
r.free;
end;
end;
Aslında yazılım kendi bir takım register anahtarları açıp okuyor ise problem oluşmuyor. Ancak hem .NET yazılımınız hemde diğer 32bitlik yazılımınız. Register kayıtlarına erişmesi gerektiği durumlarda bu problem ortaya çıkıyor.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072(v=vs.85).aspx
Yorumlar