Les- und Schreibzugriff auf die Registrierung
In diesem Tutorial möchte ich Euch ein paar Möglichkeiten präsentieren, wie man mit der Registry arbeiten kann. Es ist manchmal sehr hilfreich, kleinere Daten in der Registrierung zu speichern, um nicht extra eine Datei auslesen zu müssen, wobei beides seine Vor- und Nachteile hat ;-)
Nun gut, fangen wir mit der leichten/einfachen Variante an.
1. Einfache Variante
Ich bevorzuge diese Variante, die diese zwar sehr schlicht ist, aber einfach zu handhaben.
Bei beiden Funktionen verwendet er einen bestimmten Pfad in der Registry, den man auch nicht beeinflussen kann:
Arbeitsplatz\HKEY_CURRENT_USER\Software\VB and VBA Program Settings
Der Pfad kann je nach Betriebsystem variieren.
Auslesen aus der Registry:
Inhalt = GetSetting("Schlüsselname", "Unterordner", "Wertname")
Hierbei ist zu beachten, das die Variable "Inhalt" als String vordeklariert werden muss.
Schreiben in die Registry:
SaveSetting "Schlüsselname", "Unterordner", "Wertname", Inhalt
Auch hier muss die Variable "Inhalt" als String deklariert sein.
2. Umfangreiche Variante
Bei dieser Variante kann man unter Verwendung der API so ziemlich alles in der Registry anwählen, was man will.
Funktionen vordeklarieren:
Am besten man macht dies in einem Modul, geht aber auch im allgemeinen Teil der Form.
Private Declare Function RegOpenKey Lib "advapi32.dll" _
Alias "RegOpenKeyA" (ByVal hKey As Long, _
ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" _
Alias "RegQueryValueExA" (ByVal hKey As Long, _
ByVal lpValueName As String, ByVal lpReserved As Long, _
lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" _
Alias "RegSetValueExA" (ByVal hKey As Long, _
ByVal lpValueName As String, ByVal Reserved As Long, _
ByVal dwType As Long, lpData As Any, ByVal cbData As Long) _
As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" _
(ByVal hKey As Long) As Long
Private Declare Function RegCreateKey Lib "advapi32.dll" _
Alias "RegCreateKeyA" (ByVal hKey As Long, _
ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" _
Alias "RegDeleteValueA" (ByVal hKey As Long, _
ByVal lpValueName As String) As Long
Const HKEY_CURRENT_USER = &H80000001
Const REG_SZ = 1
Const REG_BINARY = 3
So, kommen wir gleich zu den einzelnen Funktionen.
Funktion, um einen String/Text in der Registry zu speichern:
Sub fStringSpeichern(hKey As Long, sPath As String, _
sValue As String, iData As String)
Dim vRet As Variant
'hKey (Hauptschlüssel) : z.B. HKEY_CURRENT_USER
'sPath (Schlüsselpfad) : z.B. MeineAnwendung
'sValue (Schlüsselname): z.B. Path
'iData (Schlüsselwert) : z.B. c:\programme\MeineAnwendung
RegCreateKey hKey, sPath, vRet
RegSetValueEx vRet, sValue, 0, REG_SZ, ByVal iData, _
Len(iData)
RegCloseKey vRet
End Sub
Funktion um einen BinärWert (0-255) zu speichern:
Sub fStringSpeichernLong(hKey As Long, sPath As String, _
sValue As String, iData As String)
Dim vRet As Variant
'hKey (Hauptschlüssel) : z.B. HKEY_CURRENT_USER
'sPath (Schlüsselpfad) : z.B. MeineAnwendung
'sValue (Schlüsselname): z.B. Code
'iData (Schlüsselwert) : z.B. 220
RegCreateKey hKey, sPath, vRet
RegSetValueEx vRet, sValue, 0, REG_BINARY, _
CByte(iData), 4
RegCloseKey vRet
End Sub
Funktion, um einen Wert aus einem Schlüssel auslesen:
Function fWertLesen(hKey As Long, sPath As String, _
sValue As String)
Dim vRet As Variant
'hKey (Hauptschlüssel) : z.B. HKEY_CURRENT_USER
'sPath (Schlüsselpfad) : z.B. MeineAnwendung
'sValue (Schlüsselname): z.B. Path
'Rückgabewert : z.B. c:\programme\MeineAnwendung
RegOpenKey hKey, sPath, vRet
fWertLesen = fRegAbfrageWert(vRet, sValue)
RegCloseKey vRet
End Function
Vorangehende Funktion benötigt noch nachfolgende Funktion, um den Typ des Wertes zu identifizieren.
Function fRegAbfrageWert(ByVal hKey As Long, _
ByVal sValueName As String) As String
Dim sBuffer As String
Dim lRes As Long
Dim lTypeValue As Long
Dim lBufferSizeData As Long
Dim iData As Integer
lRes = RegQueryValueEx(hKey, sValueName, 0, _
lTypeValue, ByVal 0, lBufferSizeData)
If lRes = 0 Then
If lTypeValue = REG_SZ Then
sBuffer = String(lBufferSizeData, Chr$(0))
lRes = RegQueryValueEx(hKey, sValueName, 0, _
0, ByVal sBuffer, lBufferSizeData)
If lRes = 0 Then
fRegAbfrageWert = Left$(sBuffer, _
InStr(1, sBuffer, Chr$(0)) - 1)
End If
ElseIf lTypeValue = REG_BINARY Then
lRes = RegQueryValueEx(hKey, sValueName, 0, _
0, iData, lBufferSizeData)
If lRes = 0 Then
fRegAbfrageWert = iData
End If
End If
End If
End Function
Funktion, um ein Schlüssel zu löschen:
Sub fWerteLoeschen(hKey As Long, sPath As String, _
sValue As String)
Dim vRet As Variant
'hKey (Hauptschlüssel) : z.B. HKEY_CURRENT_USER
'sPath (Schlüsselpfad) : z.B. MeineAnwendung
'sValue (Schlüsselname): z.B. Path
RegCreateKey hKey, sPath, vRet
RegDeleteValue vRet, sValue
RegCloseKey vRet
End Sub
Anwendungsbeispiele:
Hier möchte man den Pfad des Programms in der Registrierung speichern ...
Dim pfadname As String
pfadname = App.Path
fStringSpeichern HKEY_CURRENT_USER, "MeineAnwendung", _
"Pfad", pfadname
... hier wieder auslesen ...
Dim pfadname As String
pfadname = fWertLesen(HKEY_CURRENT_USER, _
"MeineAnwendung", "Pfad")
... und hier löschen
fWerteLoeschen HKEY_CURRENT_USER, "MeineAnwendung", "Pfad"
Solltet ihr Probleme bei der Anwendung dieser Funktionen haben, stehe ich Euch gerne zur Verfügung (waterloothebest@yahoo.de).