Kayıt Defteri API'sını Kullanarak Ayarları Alma ve Kaydetme

Makale çevirileri Makale çevirileri
Makale numarası: 145679 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

SUMMARY

Visual Basic, kayıt defteri bilgilerini almak ve kaydetmek için SaveSetting ve GetSetting işlevlerini içermesine karşın, bu işlevler kayıt defterinin yalnızca belirli bir bölümünde, HKEY_CURRENT_USER kök anahtarının Visual Basic ve VBA Program Settings bölümünde çalışır.

Bu makalede, kayıt defterinin herhangi bir yerindeki değerleri ayarlamak ve almak için kullanılabilen 32 bit Windows API işlevlerinin kullanımı özetlenmektedir. Bu makaledeki konu ve işlev başvuruları genel olarak 16 bit kayıt defterini programlamaya yöneliktir.

32 bit API işlevleri, güvenlik desteğini de içermektedir; ancak güvenlik değerlendirmesi bu makalenin kapsamı dışındadır.

NOT: SaveSetting ve GetSetting işlevleri, VBA işlev kitaplığının parçası değildir. Ancak, aşağıdaki örnek kod, VBA kullanan 32 bit uygulamalar için yine de geçerlidir.

MORE INFORMATION

Genel Kayıt Defteri Bilgileri

Kayıt defteri, uygulamalar ve Windows tarafından yapılandırma verilerini saklamak için kullanılır. Windows 3.x makinelerde hızla artan çok sayıda INI dosyasının yerini almıştır ve OLE tarafından da yoğun olarak kullanılmaktadır.

Kayıt defteri, bir ağaca benzeyen anahtar ve değerlerin hiyerarşik dizileri kullanılarak düzenlenmiştir. Önceden tanımlanan altı kök anahtardan biriyle başlayan her anahtarın kendisiyle ilişkilendirilmiş alt anahtarları ve değerleri olabilir. Anahtarlar, Windows Kayıt Defteri Düzenleyicilerinde dosya klasörleri olarak görünen kuruluş ve adlandırma birimleridir. Değerler, Kayıt Defteri Düzenleyicisi penceresinin sağ bölmesinde metin girdileri olarak görünen veri girdileridir. Anahtarların ilişkili değerleri olması gerekmez, ancak gerekirse değerlerle ilişkilendirilebilir. Her değerin ilişkili bir veri türü vardır. En sık kullanılan iki kayıt defteri veri türü, boş bir kesintili dize olan REG_SZ ve bir 32 bit sayı olan REG_DWORD veri türleridir.

Kayıt defterindeki bir konuma yazmak veya bir konumdan okumak için kullanılan temel yordam aynıdır. Belirli bir anahtar veya değere başvurmak için, anahtarın tanımlayıcısına sahip olmanız gerekir. Bu tanımlayıcı edinildikten sonra, anahtarın bu tanımlayıcı tarafından başvurulan değerleri ve alt anahtarları okunabilir, ayarlanabilir veya listelenebilir (numaralandırılabilir).

Kayıt defterindeki belirli bir konum verildiğinde, bu anahtarın tanımlayıcısını elde etmek için, önceden tanımlanan altı anahtardan biriyle (HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG ve HKEY_DYN_DATA) başlamalı ve istenen anahtara erişene kadar kayıt defteri ağacında ilerlemelisiniz. Kullanıcı programları genelde HKEY_CURRENT_USER ve HKEY_LOCAL_MACHINE anahtarlarından okur ve bu anahtarlara yazar. Geçilen anahtarlar zaten varsa, RegOpenKey veya RegOpenKeyEx işlevlerine yönelik bir dizi çağrı kullanabilirsiniz. Anahtarların oluşturulması gerekirse, bu işi RegCreateKey ve RegCreateKeyEx işlevleri yapar.

istenen anahtarın tanımlayıcısını oluşturulduktan sonra, bilgileri listelemek, ayarlamak ve almak için kullanılan işlevler çağırılabilir. Her koşulda, Ex soneki bulunan işlevler yalnızca 32 bit platformlarda çalışır. Soneki olmayan işlevler, Windows'un hem 16 bit hem de 32 bit sürümlerinde çalışabilir. 'Ex' soneki bulunmayan tüm kayıt defteri işlevlerinin 16 bit sürümlerle uyumlu olmadığını unutmayın. Ex soneki, yalnızca 16 bit işlevlerin becerileri genişletildiğinde eklenmişti. Tümüyle yeni ve 32 bit platformlara özgü olan işlevlerde bir Ex uzantısı bulunmamaktadır.

RegSetValue ve RegSetValueEx işlevleri, bir değerin ayarlarının değiştirilmesine izin verir; RegQueryValue ve RegQueryValueEx işlevleri ise bir değerin geçerli ayarını alır. Bu API'lerin Ex uzantısı olmayan 16 bit sürümlerindeki kısıtlamalar bu durumda kaçınılmazdır. 16 bit RegSetValue işlevini kullanırken, bir değerin adlandırılması mümkün değildir; bu nedenle, her anahtarla birden çok değeri ilişkilendirmek için RegSetValue kullanılamaz. Ayrıca, RegSetValue ile yazılan tüm değerlerde veri türü olarak REG_SZ kullanılır. Bu kısıtlamalar, 16 bit Kayıt Defteri'nden devralınmıştır. RegSetValueEx, kullanılabilen veri türleriyle birden çok değer oluşturulmasına izin verir.

Belirli Bir Kayıt Defteri Konumuna Nasıl Yazılır

Projenizde hangi işlevleri kullanmanız gerektiğini belirledikten sonra, bu makalenin sonundaki kodda yer alan ilgili bildirimleri bir temel modüle kopyalayın. İçerdiği iki Visual Basic yordamı (SetValueEx ve QueryValueEx), RegSetValueEx ve RegQueryValueEx API işlevlerinin sarıcılarıdır ve kullanımlarını oldukça kolaylaştırır. Aşağıdaki notlarda, bu Visual Basic işlevleri kullanılmaktadır; ancak, dilerseniz doğrudan API'ye çağrılar yapabilirsiniz.

Anahtar ve Değerleri Oluşturma/Değiştirme:

Kullanılabilen bildirimler ve yordamlarla, anahtarları oluşturabilir ve açabilir, değerleri ekleyebilir, değiştirebilir ve okuyabilirsiniz. Aşağıdaki üç başlıkta, bir anahtarın nasıl oluşturulacağı, bir değerin nasıl ayarlanacağı veya değiştirileceği ve bir değerin nasıl sorgulanacağı anlatılmaktadır.

Yeni Bir Anahtar Oluşturma:

Yeni bir anahtar oluşturmak için aşağıdaki yordamı kullanmanız yeterlidir. CreateNewKey, oluşturulacak anahtarın adı yerine geçer ve sabit değer de altta anahtarın oluşturulacağı önceden tanımlanan anahtarı gösterir. RegCreateKeyEx çağrısı, izin verilen güvenlik düzeneklerinden yararlanmaz; ancak bunu yapacak biçimde değiştirilebilir. Kayıt defteri güvenliği konusu bu makalenin kapsamı dışındadır.
   Private Sub CreateNewKey (sNewKeyName As String, lPredefinedKey As Long)
       Dim hNewKey As Long         'yeni anahtarın tanımlayıcısı
       Dim lRetVal As Long         'RegCreateKeyEx işlevinin sonucu

       lRetVal = RegCreateKeyEx(lPredefinedKey, sNewKeyName, 0&, _
                 vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, _
                 0&, hNewKey, lRetVal)
       RegCloseKey (hNewKey)
   End Sub
				

Bu yordamla,
   CreateNewKey "TestKey", HKEY_LOCAL_MACHINE
				

çağrısı, HKEY_LOCAL_MACHINE anahtarının hemen altında TestKey adlı bir anahtar oluşturur.

Şu şekilde CreateNewKey çağrısında bulunmak:
      CreateNewKey "TestKey\SubKey1\SubKey2", HKEY_LOCAL_MACHINE
				

, iç içe geçmiş üç anahtar oluşturur; HKEY_CURRENT_USER anahtarının hemen altında TestKey, onun altında SubKey1 ve SubKey2 altında da SubKey3.

Bir Değeri Ayarlama/Değiştirme:

Belirli bir anahtarın değerini, aşağıdaki kısa yordamla oluşturabilir ve ayarlayabilirsiniz. SetKeyValue, değerin ilişkilendirileceği anahtarı, değerin adını, ayarını ve türünü alır. (SetValueEx işlevi, yalnızca REG_SZ ve REG_DWORD anahtarını destekler; ancak, gerekirse düzenlenebilir). Var olan bir sValueName için yeni bir değer belirlemek, bu değerin geçerli ayarlarını da değiştirir.
   Private Sub SetKeyValue (sKeyName As String, sValueName As String, _
   vValueSetting As Variant, lValueType As Long)
       Dim lRetVal As Long         'SetValueEx işlevinin sonucu
       Dim hKey As Long         'açık anahtarın tanımlayıcısı

       'belirtilen anahtarı aç
       lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, _
                                 KEY_SET_VALUE, hKey)
       lRetVal = SetValueEx(hKey, sValueName, lValueType, vValueSetting)
       RegCloseKey (hKey)
   End Sub
				

Şu çağrı:
   SetKeyValue "TestKey\SubKey1", "StringValue", "Hello", REG_SZ
				

, "Hello" ayarına sahip olan "StringValue" adında ve REG_SZ türünde bir değer oluşturur. Bu değer, "TestKey" anahtarının SubKey1 anahtarıyla ilişkilendirilir.

Bu durumda, "TestKey," HKEY_CURRENT_USER anahtarının bir alt anahtarıdır; ancak bu durum, RegOpenKeyEx çağrısı değiştirilerek düzenlenebilir. Bu çağrı, "TestKey\SubKey1" yoksa başarısız olur. Bu sorunu engellemek için, RegOpenKeyEx çağrısı yerine RegCreateKeyEx çağrısı kullanın. RegCreateKeyEx, zaten varsa belirli bir anahtarı açar.

Bir Değeri Sorgulama:

Sonraki yordam, var olan bir değerin ayarından emin olmak için kullanılabilir. QueryValue, anahtarın adını ve bu anahtarla ilişkili değerin adını alır ve karşılık gelen değeri içeren bir ileti kutusu görüntüler. Aşağıda tanımlanan ve yalnızca REG_SZ ve REG_DWORD türlerini kullanan QueryValueEx sarıcı işlevine bir çağrı kullanır.
   Private Sub QueryValue (sKeyName As String, sValueName As String)
       Dim lRetVal As Long         'API işlevlerinin sonucu
       Dim hKey As Long         'açılan anahtarın tanımlayıcısı
       Dim vValue As Variant      'sorgulanan değerin ayarı

       lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, _
   KEY_QUERY_VALUE, hKey)
       lRetVal = QueryValueEx(hKey, sValueName, vValue)
       MsgBox vValue
       RegCloseKey (hKey)
   End Sub
				

Bu yordamla,
   QueryValue "TestKey\SubKey1", "StringValue"
				

çağrısı, geçerli ayar olarak "StringValue" değerini içeren bir ileti kutusu görüntüler ve "TestKey\SubKey1" anahtarında "StringValue" bulunduğunu varsayar.

Sorguladığınız Değer yoksa, QueryValue, 2 - 'ERROR_BADKEY' hata kodunu döndürür.

Ek Notlar:

Yukarıdaki örneklerde, kayıt defteri işlevlerinin genişletilmiş 32 bit sürümleri kullanılmaktadır. Bu işlevler, her anahtarla birden fazla değerin ilişkilendirilmesine izin verir. Yukarıda da anlatıldığı gibi, 16 bit RegSetValue ve RegQueryValue, geçerli anahtarla (her zaman REG_SZ türündedir) ilişkili tek bir değerde çalışır. Bu işlevler, 32 bit Kayıt Defteri Düzenleyicisi'nde <NO NAME> adıyla görünür. Bu ilişkilendirilmiş özel değeri ayarlamak, değiştirmek veya sorgulamak için, 16 bit kayıt defteri işlevleri kullanılmalıdır. 16 bit ortamda kayıt defterinden okumak ve buraya yazmak, 32 bit ortamdan çok daha kolaydır. Aynı temel yordam izlenir: bir anahtarı açın ve bir tanımlayıcı edinin, ardından da bu tanımlayıcıyı kullanarak değiştirme işlevinizi çağırın; ancak, birden çok ilişkili değer veya farklı değer veri türleri için herhangi bir işlem yapmanız gerekmez. 16 bit uygulama, RegCreateKey, RegOpenKey, RegQueryValue, RegSetValue ve RegCloseKey işlevlerini bildirmek yoluyla anahtarları ve değerleri oluşturabilir ve değiştirebilir.

Bazı durumlarda, bir anahtarla herhangi bir değerin ilişkilendirilmesi gerekmez. Uygulamanın yalnızca belirli bir anahtar veya değerin var olup olmadığını bilmesi gerekir; anahtarın değerleri konusunda bilgi sahibi olması gerekmez. Bu gibi bir durumda, belirli bir anahtarın veya değerin var olup olmadığını belirlemek için RegEnumKey, RegEnumKeyEx ve RegEnumValue işlevleri kullanılabilir. Bu işlevler hakkında daha fazla bilgi için, API Metin Görüntüleyici ve/veya Windows API başvurusundan yararlanın.

API İşlev ve Sabit Değer Bildirimleri

   Option Explicit

   Public Const REG_SZ As Long = 1
   Public Const REG_DWORD As Long = 4

   Public Const HKEY_CLASSES_ROOT = &H80000000
   Public Const HKEY_CURRENT_USER = &H80000001
   Public Const HKEY_LOCAL_MACHINE = &H80000002
   Public Const HKEY_USERS = &H80000003

   Public Const ERROR_NONE = 0
   Public Const ERROR_BADDB = 1
   Public Const ERROR_BADKEY = 2
   Public Const ERROR_CANTOPEN = 3
   Public Const ERROR_CANTREAD = 4
   Public Const ERROR_CANTWRITE = 5
   Public Const ERROR_OUTOFMEMORY = 6
   Public Const ERROR_ARENA_TRASHED = 7
   Public Const ERROR_ACCESS_DENIED = 8
   Public Const ERROR_INVALID_PARAMETERS = 87
   Public Const ERROR_NO_MORE_ITEMS = 259

   Public Const KEY_QUERY_VALUE = &H1
   Public Const KEY_SET_VALUE = &H2
   Public Const KEY_ALL_ACCESS = &H3F

   Public Const REG_OPTION_NON_VOLATILE = 0

   Declare Function RegCloseKey Lib "advapi32.dll" _
   (ByVal hKey As Long) As Long
   Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias _
   "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
   ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions _
   As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes _
   As Long, phkResult As Long, lpdwDisposition As Long) As Long
   Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias _
   "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
   ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As _
   Long) As Long
   Declare Function RegQueryValueExString Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
   As String, lpcbData As Long) As Long
   Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, lpData As _
   Long, lpcbData As Long) As Long
   Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
   As Long, lpcbData As Long) As Long
   Declare Function RegSetValueExString Lib "advapi32.dll" Alias _
   "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
   ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As _
   String, ByVal cbData As Long) As Long
   Declare Function RegSetValueExLong Lib "advapi32.dll" Alias _
   "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
   ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, _
   ByVal cbData As Long) As Long
				

SetValueEx ve QueryValueEx Sarıcı İşlevleri:
   Public Function SetValueEx(ByVal hKey As Long, sValueName As String, _
   lType As Long, vValue As Variant) As Long
       Dim lValue As Long
       Dim sValue As String
       Select Case lType
           Case REG_SZ
               sValue = vValue & Chr$(0)
               SetValueEx = RegSetValueExString(hKey, sValueName, 0&, _
                                              lType, sValue, Len(sValue))
           Case REG_DWORD
               lValue = vValue
               SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, _
   lType, lValue, 4)
           End Select
   End Function

   Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As _
   String, vValue As Variant) As Long
       Dim cch As Long
       Dim lrc As Long
       Dim lType As Long
       Dim lValue As Long
       Dim sValue As String

       On Error GoTo QueryValueExError

       ' Okunacak verinin boyutunu ve türünü belirle
       lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)
       If lrc <> ERROR_NONE Then Error 5

       Select Case lType
           ' Dizeler için
           Case REG_SZ:
               sValue = String(cch, 0)

   lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, _
   sValue, cch)
               If lrc = ERROR_NONE Then
                   vValue = Left$(sValue, cch-1)
               Else
                   vValue = Empty
               End If
           ' DWORD için
           Case REG_DWORD:
   lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, _
   lValue, cch)
               If lrc = ERROR_NONE Then vValue = lValue
           Case Else
               'desteklenmeyen tüm diğer veri türleri
               lrc = -1
       End Select

   QueryValueExExit:
       QueryValueEx = lrc
       Exit Function

   QueryValueExError:
       Resume QueryValueExExit
   End Function
				

REFERENCES

Windows 95 Kullanıcı Arabirimini Programlama, Bölüm 10 - "Kayıt Defterini Kullanmak"

İşlev başvuruları için: Herhangi bir Win16 veya Win32 API kılavuzu.

Özellikler

Makale numarası: 145679 - Last Review: 18 Ağustos 2004 Çarşamba - Gözden geçirme: 1.2
APPLIES TO
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 16-bit Enterprise Edition
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
  • Microsoft Visual Basic for Applications 5.0
  • Microsoft Visual Basic for Applications 6.0
Anahtar Kelimeler: 
kbhowto kbtophit kbcode KB145679

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com