Viele unter uns tun sich doch ziemlich schwer, wenn es darum geht, Werte und Schlüsselnamen aus der Windows-Registrierdatenbank auszulesen. Vor allem dann, wenn man nicht einen einzelnen Wert ermitteln möchte, sondern vielmehr alle Schlüsselnamen mit ihren entsprechenden Werten benötigt. Das Lesen eines einzelnen Wertes erfolgt bekanntlich über die RegQueryValue bzw. RegQueryValueEx API-Funktion. Hierzu muss jedoch der Schlüsselnamen bekannt sein. Wie lassen sich nun aber alle Schlüsselnamen eines bestimmten Zweigs ermitteln? Antwort: Mit Hilfe der RegEnumValue-Funktion. Die Funktion erwartet den Handle eines mit RegOpenKey bzw. RegOpenKeyEx geöffneten Registry-Zweigs und im zweiten Paramter den Index (0...n) des Schlüssels. 0 steht hierbei für den ersten Schlüsselnamen und n demnzufolge für den letzten Eintrag. Um nun alle Schlüsselnamen zu ermitteln, braucht man jetzt nur mit Index = 0 anzufangen, und Index solange um eins erhöhen, bis die Funktion selbst einen Wert ungleich 0 zurückgibt. Fügen Sie nachfolgenden Deklarations-Abschnitt in ein Modul ein: Option Explicit ' zunächst die benötigten API-Deklarationen Private 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 Private Declare Function RegEnumValue Lib "advapi32.dll" _ Alias "RegEnumValueA" ( _ ByVal hKey As Long, _ ByVal dwIndex As Long, _ ByVal lpValueName As String, _ lpcbValueName As Long, _ ByVal lpReserved As Long, _ lpType As Long, _ lpData As Byte, _ lpcbData 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 RegCloseKey Lib "advapi32.dll" ( _ ByVal hKey As Long) As Long Public Const HKEY_CLASSES_ROOT = &H80000000 Public Const HKEY_CURRENT_CONFIG = &H80000005 Public Const HKEY_CURRENT_USER = &H80000001 Const KEY_QUERY_VALUE = &H1 Const REG_SZ = 1 Const ERROR_SUCCESS = 0 Die nachfolgende Funktion ermittelt alle Schlüsselnamen und ihre dazugehörigen Werte und gibt diese zusammen als String-Array zurück. Hierbei sind der Schlüsselnamen selbst und der dazugehörige Wert durch ein Semikolon voneinander getrennt. Fügen Sie diese Funktion ebenfalls in das Modul ein: ' Ermitteln aller Schlüsselnamen und der ' dazugehörigen Werte eines Registry-Zweigs Public Function Reg_GetAllKeys(ByVal hKey As Long, _ ByVal sFolder As String) As Variant Dim sKeyName As String Dim sBuffer As String Dim bLen As Long Dim lType As Long Dim lHandle As Long Dim lResult As Long Dim nCount As Long Dim tmp(0 To 254) As Byte ReDim sValues(0) As String ' Registry-Zweig öffnen lResult = RegOpenKeyEx(hKey, sFolder, 0&, _ KEY_QUERY_VALUE, lHandle) If lResult = ERROR_SUCCESS Then nCount = 0 Do sKeyName = Space(255) lResult = RegEnumValue(lHandle, nCount, sKeyName, _ Len(sKeyName), 0&, 0&, tmp(0), 256) If lResult <> ERROR_SUCCESS Then Exit Do ' Schlüsselname ReDim Preserve sValues(nCount) sKeyName = Left$(sKeyName, InStr(sKeyName, _ vbNullChar) - 1) ' Wert des Schlüssels sBuffer = Space$(255) bLen = Len(sBuffer) lType = REG_SZ lResult = RegQueryValueEx(lHandle, sKeyName, 0&, _ lType, ByVal sBuffer, bLen) If lResult = ERROR_SUCCESS Then sBuffer = Left$(sBuffer, bLen) While Right$(sBuffer, 1) = Chr$(0) sBuffer = Left$(sBuffer, Len(sBuffer) - 1) Wend Else sBuffer = "" End If ' Schlüsselname;Wert sValues(nCount) = sKeyName + ";" + sBuffer ' Zähler um eins erhöhen nCount = nCount + 1 Loop ' Registry-Zweig schliessen RegCloseKey lHandle End If Reg_GetAllKeys = sValues End Function Beispiel: Private Sub Command1_Click() Dim sValues() As String Dim I As Integer sValues = Reg_GetAllKeys(HKEY_CURRENT_USER, _ "Software\Microsoft\Windows\CurrentVersion\Run") For I = 0 To UBound(sValues) List1.AddItem sValues(I) Next I End Sub Dieser Tipp wurde bereits 27.377 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
vb@rchiv CD Vol.6 Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. sevOutBar 4.0 Vertikale Menüleisten á la Outlook Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |