Registry İşlemleri

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
yhackup
Üye
Mesajlar: 118
Kayıt: 09 Ağu 2014 09:09
İletişim:

Registry İşlemleri

Mesaj gönderen yhackup »

Merhaba Arkadaşlar bir proje için Regeditte işlem yapmaya ihtiyacım var.
Kodlarım bu şekilde,
OpenKeyReadOnly ile açıp okuduğumda problem yok okuyorum,
OpenKey ile açıp okumak istediğimde bu hatayı fırlatıyor.
Resim

Resim

yapma istediğim şey key kontrol edip yoksa açmak, varsa değerine bakmak değeri farklı ise değiştirmek... bu kadar basit işte neden çuvalladım anlamadım :N(

Kod: Tümünü seç

var
Reg:TRegistry;
begin
  try
     Reg:=TRegistry.Create(KEY_READ or KEY_WRITE); 
     with Reg do
     begin
        RootKey := HKEY_LOCAL_MACHINE; Reg.Access := KEY_ALL_ACCESS;
        if KeyExists('SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION') then 
        begin 
         //OpenKeyReadOnly('SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION')  ;
         OpenKey('SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION',true);
         ShowMessage(inttostr( ReadInteger('PoWMSEditor.exe')));
         //ReadCurrency();
         //ReadBinaryData();
         //ReadBool();
         //ReadDate();
         //ReadDateTime();
         //ReadFloat();
         //ReadString();
         //ReadTime();
        end;
        Reg.CloseKey;
        Reg.Free;
     end;
  except on E: Exception do  ShowMessage(e.Message);
  end;
end;
Çaylak Delphici :D

Yakup ULUTAŞ
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Registry İşlemleri

Mesaj gönderen ertank »

Merhaba,

Yanlış anlamadı isem "FEATURE_BROWSER_EMULATION" altında "PoWMSEditor.exe" var mı diye kontrol etmiyorsun kodunda. ReadInteger için yardım kısmında şöyle bir ifade var: "If the Registry entry does not contain an integer, an exception is raised."

Bu anlamda belki aşağıdaki gibi bir yöntem deneyebilirsin.

Kod: Tümünü seç

procedure TfrmMain.Button2Click(Sender: TObject);
var
  Reg: TRegistry;
  TestString: String;
  Value: Integer;
begin
  // Create kısmı try bloğunun dışında yazman daha doğru olur.
  Reg := TRegistry.Create(KEY_READ or KEY_WRITE);
  try
    // Böyle kısa isimli bir değişken için "with" kullanmana gerek yok diye düşünüyorum. Yinede senin kodunu bu noktada değiştirmedim.
    with Reg do
    begin
      RootKey := HKEY_LOCAL_MACHINE; Reg.Access := KEY_ALL_ACCESS;
      if KeyExists('SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION') then
      begin
        OpenKey('SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION',true);
        // Değeri string değişken içine okumaya çalış.
        try
          TestString := ReadString('PoWMSEditor.exe');
        except
          // String değer okunurken hata oluşması demek kayıtlı bilgi string değil demektir. Yardım içinde ara: TRegistry.ReadString
          ShowMessage('Registry key içeriği hatalı');
        end;
        // Değer okundu. Okunan değeri Integer değişken içine aktar.
        Value := 0;
        if not TryStrToInt(TestString, Value) then
          ShowMessage('Registry key içeriği boş olabilir. Okunan değer: ' + QuotedStr(TestString))
        else
          ShowMessage('Okunan değer: ' + IntToStr(Value));
      end;
    end;
  // try..except bloğunda özel birşey yapmayıp sadece ekranda hata mesajı gösteriyorsan kullanmana gerek yok.
  finally 
    Reg.CloseKey;  // Bu iki satır try..finally bloğu içinde olduğu için yukarıdaki kodda hata oluşsa dahi hafıza kaçağı ("memory leak") olmasını engeller.
    Reg.Free;
  end;
end;
Kullanıcı avatarı
yhackup
Üye
Mesajlar: 118
Kayıt: 09 Ağu 2014 09:09
İletişim:

Re: Registry İşlemleri

Mesaj gönderen yhackup »

Edit: Pardon İngilizce yazdığınız kısmı şimdi anladım :) bu arada aynı kodları arkadaşımda sorunsuz çalıştı onda win7 bende win10 var sanırım yetkisel bir problem var..


Erkan Bey anlamadığım kısım integer bir alanı (REG_DWORD) alanı neden direk ReadInteger ile okumadınız da String okuyup integere çevirdiniz ?

finally kısmında haklısınız biliyorum öyle olduğunu ama henüz okumayı beceremediğim için oraya gelemedim ama ilk başta create ederken hemen o bloğu hazırlamak en sağlıklısıdır senin koda gelince çalışmadı.

bu blok çalıştı.
ShowMessage('Registry key içeriği boş olabilir. Okunan değer: ' + QuotedStr(TestString))

Resim
Çaylak Delphici :D

Yakup ULUTAŞ
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Registry İşlemleri

Mesaj gönderen ertank »

yhackup yazdı:senin koda gelince çalışmadı.

bu blok çalıştı.
ShowMessage('Registry key içeriği boş olabilir. Okunan değer: ' + QuotedStr(TestString))
Yukarıdan anladığım kod çalışıyor. Senin Registry içinde o değer kayıtlı değil. Ya da senin programının o değeri okuma yetkisi yok. Kodu aşağıdaki şekilde çevirelim. Belki o zaman daha anlaşılır hale gelir.

Programı derledikten sonra normal çalıştırarak dene. Bir de "Run as Administrator" şeklinde çalıştırarak dene. Bakalım sonuç değişecek mi...

Kod: Tümünü seç

procedure TfrmMain.Button2Click(Sender: TObject);
var
  Reg: TRegistry;
  Value: Integer;
begin
  // Create kısmı try bloğunun dışında yazman daha doğru olur.
  Reg := TRegistry.Create(KEY_READ or KEY_WRITE);
  try
    // Böyle kısa isimli bir değişken için "with" kullanmana gerek yok diye düşünüyorum. Yinede senin kodunu bu noktada değiştirmedim.
    with Reg do
    begin
      RootKey := HKEY_LOCAL_MACHINE; Reg.Access := KEY_ALL_ACCESS;
      if KeyExists('SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION') then
      begin
        OpenKey('SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION',true);
        // Değeri mevcut mu kontrol et
        if ValueExists('PoWMSEditor.exe') then // Değer mevcut mu?
        begin
          Value := ReadInteger('PoWMSEditor.exe');  // Değeri oku
          ShowMessage('Registry key okundu. Okunan değer: ' + QuotedStr(IntToStr(Value)));
        end else
          ShowMessage('"PoWMSEditor.exe" değeri kayıtlı değil veya okunamıyor');  // Değer mevcut değil
      end;
    end;
  // try..except bloğunda özel birşey yapmayıp sadece ekranda hata mesajı gösteriyorsan kullanmana gerek yok.
  finally
    Reg.CloseKey;  // Bu iki satır try..finally bloğu içinde olduğu için yukarıdaki kodda hata oluşsa dahi hafıza kaçağı ("memory leak") olmasını engeller.
    Reg.Free;
  end;
Kullanıcı avatarı
yhackup
Üye
Mesajlar: 118
Kayıt: 09 Ağu 2014 09:09
İletişim:

Re: Registry İşlemleri

Mesaj gönderen yhackup »

Bu oldu Ertan bey, Teşekkürler yeniyim bu işlerde öğrenmeye çalışıyorum.
yukarıda ki çalışmadıdan kastım okumadı olacaktı. kusuruma bakmayın.

Benim Hatam sadece Valueyi kontrol etmememden mi kaynaklanıyor o halde OpenKey olarak açıyorsam kesinlikle olup olmadığını denetlemem gerekiyor olarak algıladım.
Çaylak Delphici :D

Yakup ULUTAŞ
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Registry İşlemleri

Mesaj gönderen ertank »

OpenKey ile açmadan önce Key mevcut mu (KeyExists) kontrol etmek gerekiyor.
ReadInteger, ReadString vb ile okumadan önce Değer mevcut mu (ValueExists) kontrol etmek gerekiyor.
Kullanıcı avatarı
yhackup
Üye
Mesajlar: 118
Kayıt: 09 Ağu 2014 09:09
İletişim:

Re: Registry İşlemleri

Mesaj gönderen yhackup »

Anladım teşekkür ederim.
Çaylak Delphici :D

Yakup ULUTAŞ
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Registry İşlemleri

Mesaj gönderen G.Arkas »

Bir de Admin Rights ile çalıştırmayı deneyin. ;)
Resim
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Registry İşlemleri

Mesaj gönderen Lord_Ares »

Hazır bir örnek anasayfada sunulmuş isterseniz bir göz atabilirsiniz
Registry'e nasıl yazılıp, okunacağını gösteren örnek program
http://www.delphiturkiye.com/index.php?page=dfiles.htm
Cevapla