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
|
|
|