SİTE 
            İÇİ ARAMA | 
       
      
        | 
            
         | 
       
     
                    
                                     	
        
        
        
        
                    
    
                    
    
      
         Blogroll | 
       
      
        | 
              
         | 
       
     
                    
    
                    
                    
                     
                 | 
                
                    
    
        
            | 
                
             | 
         
        
            
                
                    
                        | 
                            Windows Registry Erişimi | 
                        
                             | 
                                
                     
                    
                        
                            
	
    
		
            | Gönderiliyor lütfen bekleyin... |   
        
	 
    
 
                         | 
                     
                 
             | 
         
        
            
                
                Bu yazımızda Windows
  sistemlerinde yer alan registy’ye nasıl ve ne amaçlarla erişeceğimizi ve bu
  amaçla kullanılan API fonksiyonlarını inceleyeceğiz. Registry erişimi, programımızın
  başlarken ihtiyaç duyduğu birtakım bilgileri kaydetmek veya programın çalışması
  sırasında bir şekilde saklanması gereken verileri depolamak amacıyla gerçekleştirilir.
  Örneğin programımızda kullandığımız genel parametreler için kullanıcının değer
  girmesini sağlarız ve programımız bir daha başlatıldığında, registry’den bu
  değerleri okuyarak programımızın, kullanıcının belirttiği değerlerle çalışmasını
  sağlamak amacıyla registry’yi kullanabiliriz. Ya da programımızın çalışması
  sırasında açılan formların ekran üzerindeki konumlarını Registry’ye kaydederiz
  ve kullanıcının bu formlara her erişiminde, formları ekran üzerinde aynı konumlarda
  görmesini sağlayabiliriz. 
  
Win16 sistemlerinde,
  text tabanlı yerine ini dosyaları kullanılıyordu. Gerekli bilgiler programın
  kurulumu sırasında veya sonrasında bu dosyalara kaydedilerek ihtiyaç duyulduğunda
  bu dosyalara erişiliyordu. Win32 sistemlerinde ise bu amaçlar için registy
  kullanılır. Registry anahtarlardan ve bu anahtarlara ilişkin değerlerden oluşan
  bir yapıdır. Biz API fonksiyonlarını kullanarak istediğimiz kökler altında ve
  istediğimiz dizinlerde, belirttiğimiz isimlere sahip anahtarlar yaratarak bu
  anahtarlara belli değerler veririz. Bu işlemlerin hepsini yapan birer API fonksiyonu
  vardır. Sisteminizde registry’ye erişmek içn Başlat (Start) menüsünden Çalıştır
  (Run) komutunu seçerek açılan penceredeki kutuya "regedit" yazıp tamam
  tuşuna basın.
  
Nesne yönelimli dillerde registry’ye erişim sağlayan, değer okuma değer yazma
gibi işlemleri yapan üye fonksiyonlara sahip sınıflar tanımlanmıştır. Bu sınıflar kullanılarak registry erişimi sağlanabilir. Biz API fonksiyonlarını kullanacağız. Windows tip bildirimleri,
  API fonksiyonları ve sabit tanımlamaları windows.h başlık dosyasında yer alır.
  Bu dosya genellikle, kullandığınız derleyicinin kurulu olduğu dizin içerisinde
  include dizini içerisinde yer alır.
  
 
  
 Bilgisayarınızda
  ilgili dizine ulaşıp window.h başlık dosyasını açtığınızda birçok #include yönergesi
  göreceksiniz. Bu şekilde windows.h başlık dosyasına eklenmiş başlık dosyalarından
  birisi de winreg.h başlık dosyasıdır. Aşağıdaki solda yer alan şekilde windows.h
  başlık dosyası görünüyor. 
  
          
  
winreg.h başlık
  dosyasında, bizim registry’ye erişirken kullanacağımız API fonksiyonlarının
  ve sabitlerin bildirimleri ve daha birçok bildirim yer alır. winreg.h başlık
  dosyasını yine aynı include isimli dizinden açabilir ve bu bildirimleri görebilirsiniz.
  Yazımızda, bu bildirimlerin bazılarını inceleyeceğiz. Registry’nin temelinde
  beş tane anahtar yer alır. (Windows 95 ve 98 sürümlerinde HKEY_DYN_DATA isimli bir anahtar daha bulunmaktadır.) Biz de yaratmak istediğimiz anahtarları, amacımıza
  bağlı olarak bu anahtarlardan birisinin alt dizinlerinde yaratırız. Bu temel
  beş anahtar için, anahtarlarla aynı isimlere sahip "handle" değerleri
  bildirilmiştir. 
  
  #define HKEY_CLASSES_ROOT
    ((HKEY)0x80000000)
  
 
Bu "handle"
  değerleri, ilgili oldukları anahtara ulaşmak için sistem tarafından kullanılır.
  Registry işlemleri yapan API fonksiyonları da bizden anahtarlara ilişkin handle
  değerlerini isterler. Sisteminizde registry’yi açtığınızda bu anahtarların kök
  olarak yer aldığını ve altlarında birçok dizinin bulunduğunu görürsünüz. Yukarıdaki
  sağda yer alan şekilde registry görülmektedir. Burada gördüğümüz anahtarları
  kısaca inceleyelim : 
  
  
    | 
       ANAHTARIN
        ADI 
     | 
    
       ANAHTARIN
        ANLAMI 
     | 
   
  
    | HKEY_CLASSES_ROOT | 
    Dosya
      türlerine, bileşenlere vb ilişkin bilgileri saklar | 
   
  
    | HKEY_CURRENT_USER | 
    Sistemdeki
      geçerli kullanıcıya ilişkin bilgileri saklar | 
   
  
    | HKEY_LOCAL_MACHINE | 
    Makinanin
      donanımına ilişkin bilgileri saklar | 
   
  
    | HKEY_USERS | 
    Sistemdeki
      kullanıcılara ilişkin konfigürasyon bilgilerini saklar  | 
   
  
    | HKEY_CURRENT_CONFIG | 
    Donanıma
      ilişkin bilgileri saklar | 
   
 
Kullanıcının programı
  kullanması sırasında yaratılacak anahtarlar ve saklanacak değerler için genellikle
  HKEY_CURRENT_USER anahtarının altında bir dizin belirtilir. Registry’de bir
  anahtar yaratmak için veya yeni bir anahtar oluşturmak için kullanılan API fonksiyonu
  RegCreateKeyEx veya RegCreateKey fonksiyonlarıdır. RegCreateKey fonksiyonu, 16 bitlik sistemlerde çalışır. Biz RegCreateKeyEx fonksiyonunu kullanacağız. Bu fonksiyonun prototip bildirimi winreg.h başlık
  dosyasında şu şekilde yapılmıştır :
  
	
    
      LONG RegCreateKeyEx
        (HKEY hKey, //Açık bir anahtara ilişkin handle değeri (KEY_CREATE_SUB_KEY güvenlik seçeneği ile açılmış bir anahtar olmalıdır) 
                                      
        LPCTSTR lpSubKey, //Oluşturulacak ya da açılacak anahtarın dizin yolu 
                                      
        DWORD reserved, //Bu değer 0 olarak geçilmelidir.  
                                       LPTSTR lpClass, //Anahtara ilişkin nesne türü, NULL geçilebilir 
                                      
        DWORD dwOptions, //Özel birtakım seçenekleri belirten bayrak parametresi 
                                      
        REGSAM samDesired, //Erişim güvenliği seçeneği  
                                      
        LPSECURITY_ATTRIBUTES lpSecurityAttributes, //Güvenlik yapısının adresi 
                                      
        PHKEY phkResult, //Oluşturulacak ya da açılacak anahtar için bir adres 
                                      
        LPDWORD lpdwDisposition 
        );
  
       | 
	 
 
Parametrelerden dwOptions, REG_OPTION_NON_VOLATILE, REG_OPTION_VOLATILE, REG_OPTION_BACKUP_RESTORE değerlerinden birisini alabilir.
  lpdwDisposition parametresi, fonksiyonun çalışması sırasında karşılaşılan duruma göre belli değerler içerebilir. Bu parametre, eğer söz konusu anahtar registry’de bulunamamış
  ve yaratılmışsa REG_CREATED_NEW_KEY değerine, anahtar bulunmuş ve açılmışsa REG_OPENED_EXISTING_KEY değerine sahip olacaktır.
  Bu parametreyi kullanarak anahtarın sistemde mevcut olup olmadığını kontrol edebiliriz. Fonksiyonun geri
  dönüş değeri başarı durumunu belirtir. Başarı durumunda ERROR_SUCCESS değeri
  alınır; hata durumunda ise hatayı ifade eden bir değer alınır. Şimdi HKEY_CURRENT_USER
  ana anahtarı altında bir anahtar yaratalım :
  
  
    #include <stdio.h> 
      #include <windows.h> 
      int main() 
        { 
             HKEY hMyKey; 
             DWORD dwMyDw; 
         
             if (RegCreateKeyEx(HKEY_CURRENT_USER,"MyProgramName\\MyModuleName",0,NULL,0,KEY_ALL_ACCESS,NULL,           
        &hMyKey,&dwMyDw) != ERROR_SUCCESS) {  
                   printf("Anahtar yaratilamadi veya adilamadi \n"); 
                   exit(EXIT_FAILURE); 
             } 
         
             RegCloseKey(hMyKey); 
             return 0; 
        }
          
  
     | 
   
 
Yazdığımız kodu
  adım adım inceleyelim : Öncelikle yaratacağımız veya daha önce zaten yaratılmışsa
  açacağımız anahtarın handle değerini tutmak için HKEY türünden bir değişken
  tanımladık. Fonksiyonun ilk parametresine, HKEY_CURRENT_USER anahtarının handle
  değerini geçtik. Çünkü anahtarımızı bu kök anahtar altında yaratmak istiyoruz.
  İkinci parametre olarak anahtarımızın bu kök anahtar içerisinde hangi dizinde
  yer alacağını belirten bir karakter katarı yazdık. Burada örnek olarak "MyProgramName\\MyModuleName"
  katarını kullandım. Genellikle programlara ilişkin değerler, registry’de programın
  adında açılmış bir dizin içerisinde kaydedilirler. Burada MyProgramName de bunu
  ifade ediyor. MyModuleName ise kaydedeceğimiz değerin programın hangi modulune
  ilişkin olduğunu belirten bir karakter katarı olsun. Erişim güvenliği için KEY_ALL_ACCESS
  sabitini geçerek, tam erişim sağladık. Oluşan ya da açılan anahtarımıza ilişkin
  handle değerini tutmak için kodun başında tanımladığımız hMyKey değişkeninin
  adresini gönderdik. Eğer bu fonksiyondan geri dönüş değeri olarak ERROR_SUCCESS
  sabitinin değerini alamazsak anahtar yaratma ya da açma işlemi başarısızlıkla
  sonuçlanmış demektir. Bu durumda bir hata mesajı vererek programı sonlandırıyoruz.
  Aksi takdirde oluşturduğumuz bu anahtarı RegCloseKey fonksiyonunu çağırarak
  kapatıyoruz ve program başarıyla sonlanıyor. RegCloseKey fonksiyonunun prototip
  bildirimi winreg.h içerisinde şu şekilde yapılmıştır :
  
  
    
      LONG RegCloseKey
        (HKEY hKey);
  
     | 
   
 
RegCloseKey fonksiyonu
  açılan bir anahtarın kapatılması için kullanılır. HKEY türünden bir parametre
  alır. Bu parametre kapatılacak anahtara ilşkin handle değeridir. RegCreateKeyEx
  fonksiyonunda kullandığımız HKEY türünden hMyKey değişkeni, kapatmak istediğimiz
  anahtara ilişkin handle değerini turuyordu. Dolayısıyla RegCloseKey fonksiyonuna
  bu değeri geçtiğimizde açık olan anahtarımız kapatılacaktır. Oluşan anahtarı
  sisteminizde registry’yi açarak görebilirsiniz. Benim sistemdeki görüntü şu
  şekilde :
  
 
  
Gördüğünüz gibi
  belirttiğimiz temel anahtar altında, belirttiğimiz dizinler açılmış durumdadır.
  Ancak şu anda anahtarımızın altında hiçbir değer yok. Değer atanmamış isimsiz
  anahtarlar varsayılan değerler olarak adlandırılır. Yukarıdaki şekilde sağ kısımda
  yer alan Default ifadesi bunu göstermekttedir. Açtığımız anahtar için bir değer
  atamak amacıyla RegSetValueEx fonksiyonunu kullanacağız. Bu fonksiyonun winreg.h
  başlık dosyasındaki bildirimi şu şekildedir :
  
  
    
      LONG RegSetValueEx(HKEY
        hKey, //Değer atanacak anahtara ilişkin handle değeri 
                                    
        LPCTSTR lpValueName, //Atanacak değerin ismi 
                                     DWORD reserved, 
                                    
        DWORD dwType, //Değerin içerdiği verilere ilişkin tür bilgisi 
                                    
        CONST BYTE *lpData, //Atanacak değer 
                                    
        DWORD cbData //Atanacak değerin byte olarak uzunluğu 
        );
  
     | 
   
 
Fonksiyonun ilk
  parametresi olarak açık olan anahtarımızın handle değerini geçiyoruz. İkinci
  parametre atayacağımız değere ilişkin bir isim belirtiyor. Tür bilgisi olarak
  winreg.h başlık dosyasında bildirilmiş bir takım sembolik sabitler geçilir.
  Son parametreler ise atanacak değerin kendisi ve uzunluğudur. Tür bilgisi olarak
  geçilebilecek sabitler başlık dosyasında şu şekilde bildirilmiştir :
  
  
    
      #define REG_NONE
        0  
        #define REG_SZ 1  
        #define REG_EXPAND_SZ 2  
        #define REG_BINARY 3  
        #define REG_DWORD_LITTLE_ENDIAN 4  
        #define REG_DWORD 4  
        #define REG_DWORD_BIG_ENDIAN 5  
        #define REG_LINK 6  
        #define REG_MULTI_SZ 7  
        #define REG_RESOURCE_LIST 8  
  
     | 
   
 
Saklayacağımız değer bir karakter katarı ise REG_SZ sabitini, bir tamsayı ise REG_DWORD sabitini, ikilik bir tamsayı ise
REG_BINARY sabitini kullanırız. REG_EXPAND_SZ sabiti de karakter katarı saklamak için kullanılır. Ek olarak belli özel biçim karakterlerini de yorumlar. Şimdi yukarıda
  oluşturduğumuz anahtar için bir değer atayalım :
  
  
    #include <stdio.h> 
      #include <windows.h> 
      int main() 
        { 
             HKEY hMyKey; 
             DWORD dwMyDw; 
             const BYTE *data = "deneme"; 
         
             if (RegCreateKeyEx(HKEY_CURRENT_USER,"MyProgramName\\MyModuleName", 
                 0,NULL,0,KEY_ALL_ACCESS,NULL,&hMyKey,&dwMyDw) != ERROR_SUCCESS)
        {
         
                       printf("Anahtar yaratilamadi veya adilamadi \n"); 
                       exit(EXIT_FAILURE); 
             } 
         
             RegSetValueEx(hMyKey,"anahtarim",0,REG_EXPAND_SZ,data,6); 
             RegCloseKey(hMyKey); 
             return 0; 
        }
          
  
     | 
   
 
Anahtarımıza "anahtarim"
  isminde bir değer atadık ve değer bilgisi olarak da "deneme" değerini
  geçtik. Bu kodu çalıştırdıktan sonra registry’yi açtığınızda değerin verilmiş
  olduğunu göreceksiniz. Benim sistemimde registry’nin görünümü şu şekilde :
  
 
  
Peki bir değeri
  anahtarımızdan nasıl sileriz? Bunun için RegDeleteValue fonksiyonu kullanılır.
  Fonksiyonun winreg.h başlık dosyasında bildirilen prototipi şöyledir :
  
  
    
      LONG RegDeleteValue
        (HKEY hKey, //Değeri silinecek anahtarın handle değeri 
                                      
        LPCTSTR lpValueName //Silinecek değerin ismi 
        );
  
     | 
   
 
Anahtardan bir
  değeri silmek için öncelikle o anahtarı açmamız gerekir. Bu amaçla OpenRegKeyEx
  fonksiyonunu kullanalım. Bu fonksiyon, CreateRegKeyEx fonksiyonuna büyük ölçüde
  benzemektedir. Ancak varolan bir anahtarı açmak için kullanılır. Önce anahtarı
  açalım, daha sonra silmek istediğimiz değeri bildirerek işlemi gerçekleştirelim
  : 
  
  
    
      #include
        <stdio.h> 
        #include <windows.h>
  
      int main() 
        { 
             HKEY hMyKey; 
        
  
           if (RegOpenKeyEx(HKEY_CURRENT_USER,"MyProgramName\\MyModuleName",0,KEY_ALL_ACCESS,&hMyKey)
      != ERROR_SUCCESS) { 
               printf("acilamadi \n");          exit(EXIT_FAILURE);      } 
       
           if (RegDeleteValue(hMyKey,"anahtarim") != ERROR_SUCCESS) { 
               printf("silinemedi \n");          RegCloseKey(hMyKey);           exit(EXIT_FAILURE);      } 
           RegCloseKey(hMyKey);       return 0; 
      } 
         | 
   
 
Öncelikle oluşturduğumuz
  anahtara ilişkin temel anahtar ismini ve anahtarın dizin yolunu verdik ve anahtarı
  açtık. Daha sonra açtığımız anahtara ilişkin "anahtarim" isimli değeri
  silmeye çalıştık. Fonksiyonların geri dönüş değerlerini kontrol ederek, işlemlerin
  başarısız olması durumunda programı sonlandırdık. RegDeleteVal fonksiyonunun
  geri dönüş değerinin kontrol edildiği if ifadesinin bloğuna girilirse işlem
  başarısız olmuş demektir. Bu durumda bir hata mesajı verdik ve programı sonlandırdık.
  Sonlandırmadan önce de açmış olduğumuz anahtarı RegCloseKey fonksiyonu ile kapattık.
  
  
Sonuç olarak bu
  yazımızda registry’ye kayıt yapma işlemlerini basit bir şekilde ele aldık. Registry
  üzerinde yapılan başka işlemler ve bu işlemlere ilşkin API fonksiyonları da
  vardır. Bu konuları da yeni bir yazımızda ele alabiliriz. Uygulamanın kaynak
  kodunu buradan
    indirebilirsiniz.
  Bir sonraki yazımızda görüşmek üzere, mutlu günler dilerim. 
  
 
  
                
                Makale: 
                Windows Registry Erişimi C ve Sistem Programlama Çiğdem Çavdaroğlu 
             | 
         
        
            | 
             | 
         
        
            | 
                 
             | 
         
        
            
                
                
                    
                        - 
                            
                        
 
                        - 
                            
Eklenen Son 10  
                         
                        - 
                            
Bu Konuda Geçmiş 10 
                         
                     
                    
                        
                            Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
                         
                        
                            Son Eklenen 10 Makale Yükleniyor
                         
                        
                            Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
                         
                     
                 
                
                
             | 
         
        
            | 
                
             | 
         
     
                 |