Delphi’de Registry (Kayıt Defteri) işlemleri

Windows Registry (Kayıt Defteri) sistem ve sistemdeki uygulamaların ayarlarını ve bilgilerini saklamak için kullanılan bir sistem veritabanıdır. Registry’nin temeli COM-temelli bileşenlerin bilgilerinin saklanması amacıyla Windows 3.1’de atılmasına karşın Windows 95 ve Windows NT’de kullanımı genişletilmiş ve sistem ve sistemdeki uygulamaların bilgileri ve ayarlarını saklanmasına olanak sağlanmıştır.

Eskiden uygulamalar ayarlarını saklamak için .ini dosyalar kullanırken günümüzde Windows’un Registry kullanılmaktadır.

Registry’deki Anahtar ve Verileri görmek veya düzenlemek için Windows ile gelen Kayıt Defteri Düzenleyicisi (regedt32.exe) kullanılabilir.

Registry’de Windows’un ve sistemdeki diğer uygulamaların bilgileri saklandığı için üzerinde işlem yaparken dikkatli olunmalıdır. Gereksiz bilgilerin saklanması veya veritabanı amacıyla kullanılması şişmesine ve sistemin yavaşlamasına sebep olacaktır. Ayrıca sistemin veya diğer uygulamaların kullandığı kayıtlar yanlışlıkla silinir veya değiştirilirse bu sistemin yada uygulamaların hatalı çalışmasına sebep olabilir. Bu hata, uygulamaların hatta sistemin çökmesine kadar varabilir.

Registry’de 5 adet temel Ana anahtar (root keys) vardır. Bunlar :

Registry ana anahtarları

Registry yapısı aşağıdaki şekildedir:
[Ana Anahtar]
  [Alt Anahtar]
    [Alt Anahtar2]
    …
    Değer Adı = Değer Verisi

Aşağıda Registry anahtar yapısı örneği vardır (Resim daha anlaşılır olması için değiştirilmiştir) :

Registry anahtar yapısı örneği

Registry’de kullanılan bazı değer verisi çeşitleri şunlardır:

  • REG_BINARY : Herhangi bir şekilde ikili bilgi.
  • REG_DWORD : 32-bit sayı.
  • REG_QWORD : 64-bit sayı.
  • REG_DWORD_LITTLE_ENDIAN : 32-bit little-endian formatında sayı.
  • REG_QWORD_LITTLE_ENDIAN : 64-bit little-endian formatında sayı.
  • REG_DWORD_BIG_ENDIAN : 32-bit big-endian formatında sayı.
  • REG_EXPAND_SZ : #0 (null) karakterine kadar string. Bu veri türü, bir program veya hizmet veri kullandığında çözülen değişkenler içerir.
  • REG_LINK : Unicode bağlantı.
  • REG_MULTI_SZ : Çift #0 (null) karakterine kadar stringler. Her bir string arasında tek #0 (null) veya başka karakterler vardır.
  • REG_NONE : Tanımlanmamış veri tipi.
  • REG_RESOURCE_LIST : Aygıt sürücüsü kaynak listesi.
  • REG_SZ : #0 (null) karakterine kadar string.

Aşağıda Registry’den rastgele alınmış veri tipleri ve bunların verilerinin örneği görülmektedir:
Registryde örnek veri tipleri ve verileri

Delphi ile Registry’e bilgi yazmak ve Registry’den bilgi okumak çok kolaydır. Delphi’de Registry kullanımına iki sınıf bulunur. Bunlar TRegistry ve TRegIniFile’dir. TRegistry sınıfı ile Registry’de işlemler çok kolaydır.

TRegistry sınıfını kullanmak için Uses kısmına Registry yazılmalıdır.

...
Uses ..., Registry;

Registry’nin kullanılabilmesi için önce nesne oluşturulur. Aşağıda nesne oluşturma işlemi için örnek görülmektedir.

...
Var Reg : TRegistry;
Begin
   Reg := TRegistry.Create;
   Reg.RootKey := HKEY_CURRENT_USER;
   Reg.OpenKey('Software\Dm7blog\Bilgiler\', True); 
...

Varsayılan olarak HKEY_CURRENT_USER ana anahtarı kullanılır. Rootkey fonksiyonu ile farklı Ana anahtar seçilebilir. Fakat bu fazla tercih edilmez. Ayrıca farklı Ana anahtar kullanıldığında Windows sistem Yönetici İzni gerekebilir.

Daha sonra işlem yapmak istenilen alt anahtar OpenKey fonksiyonu ile açılmalıdır. OpenKey fonksiyonu iki parametre alır. Birincisi açılmak istenen alt anahtar, diğeri ise açılmak istenen anahtar yoksa bu anahtarın oluşturulup, oluşturulmayacağı özelliğidir. İkinci özelliğe True değeri atanırsa açılmak istenen anahtar yok ise bu anahtar oluşturulur.

Eğer alt anahtar sadece okumak için açılıyorsa OpenKey fonksiyonu yerine OpenKeyReadOnly fonksiyonu kullanılabilir. Bu fonksiyonun sadece açılmak istenen alt anahtar parametresi vardır.

...
Var Reg : TRegistry;
Begin
   Reg := TRegistry.Create;
   Reg.RootKey := HKEY_CURRENT_USER;
   Reg.OpenKeyReadOnly('Software\Dm7blog\Bilgiler\'); 
...

Registry ile işlem bittiğinde anahtarı kapatmak için CloseKey fonksiyonu kullanılabilir. Free fonksiyonu ile nesne yok edilirken aynı zamanda anahtar kapatılır.

 ...
 Reg.CloseKey; // İşlem bitti Anahtar kapatılıyor.
 ...
 ...
 Reg.Free; // Anahtar kapatılıp nesne yok ediliyor.
 ...

Bazı TRegistry Anahtar Fonksiyonları

CreateKey : Yeni bir alt anahtar oluşturmak için kullanılır. Kullanımı :

...
Var Reg : TRegistry;
Begin
 Reg := TRegistry.Create;
 Reg.CreateKey('Software\Dm7blog\Bilgiler\');
...

DeleteKey : Alt anahtarı silmek için kullanılır. Silinecek alt anahtarın altında alt anahtar olmamalıdır. Silerken en alt anahtardan başlanmalıdır. Kullanımı :

...
Var Reg : TRegistry;
Begin
 Reg := TRegistry.Create;
 Reg.DeleteKey('Software\Dm7blog\Bilgiler\');
 // Bilgiler alt anahtarını siler
 Reg.DeleteKey('Software\Dm7blog\'); 
 // Dm7blog alt anahtarını siler
...

KeyExists : Bir alt anahtarın var olup olmadığını kontrol etmek için kullanılır. Kullanımı :

...
Var Reg : TRegistry;
Begin
 Reg := TRegistry.Create;
 If Reg.KeyExists('Software\Dm7blog\Ayarlarim\') 
  then ShowMessage('Alt anahtar var!');
...

GetKeyNames : Bir alt anahtarın tüm alt anahtarlarının listesini almak için kullanılır. Sonuç TStrings tipinde listelenir. Kullanımı :

...
Var Reg : TRegistry;
Begin
   Reg := TRegistry.Create;
   Reg.OpenKey('Software\Dm7blog\', False);
   Reg.GetKeyNames(Listbox1.Items);
   // Dm7Blog alt anahtarının tüm alt 
   // anahtarlarını Listbox'a ekler
...

HasSubKeys : Bir alt anahtarın altında alt anahtarlar olup olmadığını kontrol etmek için kullanılır. Alt anahtarlar varsa True yoksa False döndürür. Kullanımı :

...
Var Reg : TRegistry;
Begin
   Reg := TRegistry.Create;
   Reg.OpenKey('Software\Dm7blog\', False);
   if Reg.HasSubKeys then
    ShowMessage('Alt anahtarın altında Alt anahtarlar var!')
   else
    ShowMessage('Alt anahtarın altında Alt anahtarlar yok!');
...

MoveKey : Bir alt anahtarın seçilen alt anahtarlarını taşımak için kullanılır. Son parametresi True verilirse eskisini silerek Verileri taşır, False verilirse eskisini silmeden Verileri kopyalar. Kullanımı :

...
Var Reg : TRegistry;
Begin
   Reg := TRegistry.Create;
   Reg.OpenKey('Software\Dm7blog\', False);
   Reg.MoveKey('Bilgiler', 'SiteBilgileri', True); 
   // Taşır

   Reg.MoveKey('Bilgiler', 'SiteBilgileri', False); 
   // Kopyalar
...

Bazı TRegistry Veri Fonksiyonları

Anahtarlara veri yazmak için aşağıdaki fonksiyonlar kullanılır:

WriteString : Seçili anahtara String tipinde Veri yazar. Sonuç REG_SZ tipindedir.
WriteInteger : Seçili anahtara Integer tipinde Veri yazar. Sonuç REG_DWORD tipindedir.
WriteBool : Seçili anahtara Boolean tipinde Veri yazar. Sonuç REG_DWORD tipindedir.
WriteFloat : Seçili anahtara Reel tipinde Veri yazar. Sonuç REG_BINARY tipindedir.
WriteCurrency : Seçili anahtara Para birimi (Reel) tipinde Veri yazar. Sonuç REG_BINARY tipindedir.
WriteDate : Seçili anahtara Tarih tipinde Veri yazar. Sonuç REG_BINARY tipindedir.
WriteTime : Seçili anahtara Saat tipinde Veri yazar. Sonuç REG_BINARY tipindedir.
WriteDateTime : Seçili anahtara Tarih-Saat tipinde Veri yazar. Sonuç REG_BINARY tipindedir.
WriteBinaryData : Seçili anahtara doğrudan Binary tipinde Veri yazar. Sonuç REG_BINARY tipindedir.

...
Var Reg : TRegistry; bilgi : Array [0..3] of byte;
Begin
   Reg := TRegistry.Create;
   Reg.OpenKey('Software\Dm7blog\Bilgiler', True);
   Reg.WriteString('SiteIsmi', 'Dm7blog Programlama Sitesi');
   Reg.WriteInteger('SiteZiyaretci', 46000);
   Reg.WriteBool('SiteAktifmi', True);
   Reg.WriteFloat('BirReelSayi', 123.456);
   Reg.WriteCurrency('BirParaBirimi', 19.50);
   // Bazı sistemlerde reel sayılarda ve para birimlerinde
   // virgül, bazı sistemlerde ise nokta kullanılır.
   Reg.WriteDateTime('SuAnkiTarihSaat', Now);
   Reg.WriteDateTime('SiteGuncellemeTarihiSaati', StrToDateTime('23.02.2016 22:40'));
   Reg.WriteDate('SiteGuncellemeTarihi', StrToDate('23.02.2016'));
   Reg.WriteTime('SiteGuncellemeSaati', StrToTime('22:40'));
   // String tipindeki veriyi Tarih, Saat veya Tarih-Saat tipine
   // dönüştüren fonksiyonlarda girilen String değerin o anki 
   // sistem ayarına uygun olmasına dikkat edilmelidir.
   bilgi[0] := 100; bilgi[1] := 101; 
   bilgi[2] := 102; bilgi[3] := 103;
   Reg.WriteBinaryData('BinaryBilgi', bilgi, sizeOf(bilgi));
   ...

Yukarıdaki kodla eklenmiş Anahtar ve Veriler, Kayıt Defteri Düzenleyicisinde (regedt32.exe) aşağıdaki şekilde görünecektir:

Registry'e eklenmiş Anahtar ve Veriler

Anahtarlardan veri okumak için aşağıdaki fonksiyonlar kullanılır:

ReadString : Seçili anahtardan String tipinde Veri okur.
ReadInteger : Seçili anahtardan Integer tipinde Veri okur.
ReadBool : Seçili anahtardan Boolean tipinde Veri okur.
ReadFloat : Seçili anahtardan Reel tipinde Veri okur.
ReadCurrency : Seçili anahtara Para birimi (Reel) tipinde Veri okur.
ReadDate : Seçili anahtardan Tarih tipinde Veri okur.
ReadTime : Seçili anahtardan Saat tipinde Veri okur.
ReadDateTime : Seçili anahtardan Tarih-Saat tipinde Veri okur.
ReadBinaryData : Seçili anahtardan doğrudan Binary tipinde Veri okur.

...
Var Reg : TRegistry; 
    s : string; i : integer; b : boolean; d, p : double;
    ts, sts, st, ss : TDateTime;
    bilgi : Array [0..3] of byte;
Begin
   Reg := TRegistry.Create;
   Reg.OpenKey('Software\Dm7blog\Bilgiler', True);
  
   s:= Reg.ReadString('SiteIsmi');
   i := Reg.ReadInteger('SiteZiyaretci');
   b := Reg.ReadBool('SiteAktifmi');
   d := Reg.ReadFloat('BirReelSayi');
   p := Reg.ReadCurrency('BirParaBirimi');
   ts := Reg.ReadDateTime('SuAnkiTarihSaat');
   sts := Reg.ReadDateTime('SiteGuncellemeTarihiSaati');
   st := Reg.ReadDate('SiteGuncellemeTarihi');
   ss := Reg.ReadTime('SiteGuncellemeSaati');
   Reg.ReadBinaryData('BinaryBilgi', bilgi, sizeOf(bilgi));
   ...

Not Her veri okuma işleminden önce Verinin olup olmadığı kontrol edilmelidir.

Diğer Anahtar işlemleri için aşağıdaki fonksiyonlar kullanılır:

ValueExists : Seçili anahtarda Verinin olup olmadığını kontrol eder. Varsa True yoksa False döndürür.
DeleteValue : Seçili anahtarda yazılan Veriyi silmek için kullanılır.
GetValueNames : Seçili anahtardaki tüm Verilerin listesini almak için kullanılır. Sonuç TStrings tipinde listelenir.
RenameValue : Seçili anahtardaki yazılan Verinin adını değiştirmek için kullanılır.

...
Var Reg : TRegistry; 
Begin
   Reg := TRegistry.Create;
   Reg.OpenKey('Software\Dm7blog\Bilgiler', False);
   
   if Reg.ValueExists('SuAnkiTarihSaat') then
    Reg.DeleteValue('SuAnkiTarihSaat'); 
   // SuAnkiTarihSaat Verisinin varlığı
   // kontrol ediliyor. Varsa anahtar 
   // siliniyor.
   
   Reg.GetValueNames(Listbox1.Items);
   // Dm7Blog/Bilgiler alt anahtarının tüm alt 
   // Verilerinin isimlerini Listbox'a ekler
   
   Reg.RenameValue('SiteIsmi', 'SiteninIsmi');
   // SiteIsmi verisi SiteninIsmi 
   // diye değiştiriliyor.
   ...

Not Windows XP, Windows Server 2003 ve Windows Vista’nın 64-bit sürümlerindeki kayıt defteri 32-bit ve 64-bit anahtarlarına bölünmüştür. 32-bit anahtarların çoğu 64-bit karşılıklarıyla ve 64-bit anahtarların çoğu da 32-bit karşılıklarıyla aynı adı taşır. Kayıt Defteri Düzenleyicisi’nin Windows XP, Windows Server 2003 ve Windows Vista’nın 64-bit sürümlerinde bulunan varsayılan 64-bit sürümü 32-bit anahtarları aşağıdaki düğüm altında gösterir:
HKEY_LOCAL_MACHINE\Software\WOW6432Node

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.