Registry 32-64 bit sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
erdem55
Üye
Mesajlar: 32
Kayıt: 18 Mar 2014 06:54

Registry 32-64 bit sorunu

Mesaj gönderen erdem55 »

Program 32 işletim sisteminde sorunsuz çalışırken 64 bitte nedense Registry'ye kodu eklesem bile yokmuş gibi hata veriyor.

Kod: Tümünü seç

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Exchange
içinde xprogram adlı bir dize değeri oluşturup, içindeki değer "D" ise program devam ediyor. Bu değer yoksa yada farklı bir değer varsa hata veriyor.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Registry 32-64 bit sorunu

Mesaj gönderen ertank »

Merhaba,

Açıkça belirtmemişsiniz. Benim anladığım uygulamanız 32bit olarak derleniyor.

64bit Windows işletim sistemi altında farklı bit seviyesindeki uygulamaların aşağıdaki şekilde registry erişimi yapmaları gerekir:
- 32Bit uygulama 64Bit işletim sistemi: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Exchange
- 64Bit uygulama 64Bit işletim sistemi: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Exchange

Bu şu anlama geliyor. 64Bit Windows işletim sistemi altında sizin uygulamanız hem 64Bit hem 32Bit olarak çalışıyor ise ikiside farklı registry değerlerini okuyor olacak. Bu 32Bit işletim sistemlerini desteklemek için Microsoft'un kurmuş olduğu bir yapıdır.

Kullandığınız Delphi sürümünü belirtmemişsiniz. Delphi 10.3.3 ile işletim sistemi bit seviyesini öğrenmek için aşağıdaki gibi bir kod kullanabilirsiniz:

Kod: Tümünü seç

  if TOSVersion.Architecture = TOSVersion.TArchitecture.arIntelX86 then
  begin
    // 32bit işletim sistemi
  end
  else
  if TOSVersion.Architecture = TOSVersion.TArchitecture.arIntelX64 then
  begin
    // 64bit işletim sistemi
  end;
Daha detaylı bilgiye aşağıdaki bağlantıdan erişebilirsiniz.
https://docs.microsoft.com/tr-tr/window ... dfrom=MSDN

Microsoft yukarıdaki dökümanda belli fonksiyonları kullanarak (Winapi) her zaman 32bit veya her zaman 64bit değerlerin okunabileceğini belirtmiş. Bilgim dahilinde TRegistry sınıfı maalesef bu işlemi kolaylaştırıcı bir yöntem sunmuyor. Yani sürekli 32bit alana ait değerleri okuma/yazma yapmak istiyor iseniz winapi kullanmanız gerekecek. İlgili fonksiyonlar için Delphi header tanımları yok ise bunları da kendinizin tanımlaması gerekecek.
erdem55
Üye
Mesajlar: 32
Kayıt: 18 Mar 2014 06:54

Re: Registry 32-64 bit sorunu

Mesaj gönderen erdem55 »

ertank yazdı: 25 Ağu 2020 01:44 Merhaba,

Öncelikle cevabınız için çok teşekkür ederim. Haklısınız program 32 bit ile derleniyor. Bu sebeple aşağıda belirmiş olduğunuz yanıt benim için son derece yeterli. Bazen insanın aklı gerçekten duruyormuş, bunu daha iyi anladım.

Kod: Tümünü seç

- 32Bit uygulama 64Bit işletim sistemi: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Exchange
- 64Bit uygulama 64Bit işletim sistemi: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Exchange
Tekrar teşekkür ediyorum.

işletim sistemi bit değerini öğrenmek için aşağıdaki yapıyı kullanıyorum.

Kod: Tümünü seç

function IsWOW64: Boolean; type TIsWow64Process = function(Handle: THandle;
  var Res: BOOL):BOOL;stdcall;var  IsWow64Result: BOOL;  IsWow64Process: TIsWow64Process;
begin
  IsWow64Process := GetProcAddress(GetModuleHandle('kernel32'), 'IsWow64Process');
  if Assigned(IsWow64Process) then
    begin
      if not IsWow64Process(GetCurrentProcess, IsWow64Result) then
        raise
          Exception.Create('Geçersiz fonksiyon!...');
          Result := IsWow64Result;
      end else
        Result := False;
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if IsWOW64 then
    Application.MessageBox('Windows Sistem Türü: 64 Bit', 'Sistem Türü',
      MB_IconInformation+MB_OK)
  else
    Application.MessageBox('Windows Sistem Türü: 32 Bit', 'Sistem Türü',
      MB_IconInformation+MB_OK)
end;
Cevapla