Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Çiğdem Çavdaroğlu
Çiğdem Çavdaroğlu
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
28 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: #define anahtar anahtara anahtari anahtarin baslik degeri degerin degerini fonksiyonun handle iliskin kullanilir. registry winreg.h C / Sys Prog. Çiğdem Çavdaroğlu
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : C / Sys Prog.
Yayınlanma Tarihi : 2.6.2005
Okunma Sayısı : 23904
Yorum Sayısı : 0     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 22.11.2024
Turhal Temizer
Mac OS/X Removing CUDA 22.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 22.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 22.11.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Windows Registry Erişimi
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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
  • Yazılan Yorumlar
  • Yorum Yaz
Bu konu hakkında yayınlanan yorum bulunmamaktadır.
"Yorum Yaz" tabını kullanarak sizde yorumlarınızı yazabilirsiniz.
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • 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