Registry-Zugriff per VBA

Die Windows Registrierungsdatenbank, kurz Registry, ist die zentrale Sammelstelle für Einstellungsdaten aller Art. Die Konfiguration des gesamten Systems und fast aller Anwendungen hängt von ihr ab. Ob lesend oder schreibend, auch als Access-Entwickler hätte man gern eine Programmierschnittstelle für den Zugriff auf die Registry. Weil VBA hier nur eingeschränkte Möglichkeiten bietet, ist dem Thema dieser Beitrag gewidmet.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1408_Registry.mdb.

Eingebaute Zugriffsmethoden

Im Beitrag Anwendungseinstellungen abspeichern dieser Ausgabe wurde deutlich, dass die Werte von Eigenschaftsvariablen, die über die aktuelle Access-Sitzung hinaus Bestand haben sollen, außerhalb der Datenbank selbst gespeichert werden müssen. Statt dafür eine externe verknüpfte Tabelle zu verwenden, könnte man ebenso Variablen in der Registry unterbringen.

Genau dieser Zweck schwebte den VBA-Entwicklern wohl vor, als sie die vier Methoden zum Zugriff auf die Registry in die VBA-Bibliothek einbauten. Sie lauten

GetSettingGetAllSettingsSaveSettingDeleteSetting

GetSetting liest einen Registry-Wert aus, GetAllSettings liest alle Werte eines Schlüssels auf einmal, SaveSetting schreibt einen Wert in die Registry, und DeleteSetting löscht einen solchen wieder. Der Haken an der Sache ist, dass all diese Methoden nur einen ganz kleinen reservierten Bereich der Registry ansprechen können, nämlich den Schlüssel

HKEY_CURRENT_USER\Software\
  VB and VBA Program Settings

Unterhalb dieses Schlüssels kann man walten, wie man will, aber von allen anderen Bereichen der Registry ist man ausgesperrt. Dass dieser Schlüssel unter HKEY_CURRENT_USER liegt, ist nicht verwunderlich, denn für alle anderen Root-Schlüssel benötigt man schreibend Administratorrechte – und Access wird normalerweise nicht mit diesen Rechten gestartet.

Die Schlüsselstruktur unterhalb dieses Hauptschlüssels ist immer dieselbe. Sie wird in Bild 1 ersichtlich. Dort ist ein Zweig abgebildet, der über die Routinen der Beispieldatenbank erstellt wurde. AB_Registry als Unterschlüssel ist quasi der Generalschlüssel und Anwendungsname, und darunter kann ein oder können mehrere Bereichsschlüssel liegen. Im Beispiel ist es nur einer mit dem Namen General. Werte können außerdem nur im untersten Schlüssel gespeichert werden, also nicht etwa unter AB_Registry. Sie können eine beliebige Anzahl von Werten unterbringen. Bei größerem Umfang ist der übersicht halber aber die Anlage mehrerer Unterschlüssel überlegenswert. Zum General-Schlüssel könnte etwa noch ein Printer-Schlüssel kommen, der Werte für die Steuerung von Druckern aufnähme.

Der von VBA aus zugängliche Bereich der Registry

Bild 1: Der von VBA aus zugängliche Bereich der Registry

Wie kommt nun der Test-Eintrag zustande Die Syntax der Code-Zeile sieht so aus:

SaveSetting "AB_Registry", "General", "Test0", "Sascha"

Als Parameter werden also Hauptschlüssel, Unterschlüssel, Wertname und Wert übergeben. Die Schlüssel müssen zuvor nicht erst angelegt worden sein, wie das etwa bei Routinen, die das Windows-API benutzen, der Fall ist. Die SaveSetting-Anweisung macht alles auf einen Schlag: Hauptschlüssel, Unterschlüssel anlegen, Wert speichern. Als Wert können Sie einen beliebigen Variant-Typ übergeben und das selbstredend auch über eine Variable. Erlaubt sind alle Standarddatentypen, nicht jedoch Arrays oder Objekte. Es spielt keine Rolle, welchen Datentyp Sie verwenden, denn alle werden automatisch in Strings verwandelt. In Bild 1 wird das aus der Typ-Spalte des Editors ersichtlich, wo alle Werte als REG_SZ aufgeführt sind, dem Pendant zu vbString.

Mit GetSetting lesen Sie den Wert über diese Syntax aus:

 GetSetting ("AB_Registry", "General", "Test0", "nix")

Die Parameter sind also Hauptschlüssel, Unterschlüssel, Wertname, und die Rückgabe ist immer vom Typ String. Ganz hinten können Sie optional noch einen weiteren Parameter anschließen. Das ist ein Wert, der immer dann als Resultat der Funktion zurückgegeben wird, wenn entweder der Registry-Wert leer ist, der Wertname nicht existiert, oder es den Schlüssel selbst nicht gibt. VBA löst nämlich keine Fehler aus, wenn die Namensparameter ungültig sind!

Im Modul mdlRegistryBeispiele der Beispieldatenbank finden Sie mehrere Prozeduren, die den Umgang mit den vier VBA-Methoden vereinfachen. Einen Ausschnitt daraus zeigt Listing 1. Statt etwa GetSetting immer mit allen fünf Parametern bestücken zu müssen, nehmen Sie einfach die kürzere Variante SaveVarToRegistry, welche nur einen Parameter erwartet: den Wertnamen.

Public Const cMainRegKey = "AB_Registry"
Public Const cSubRegKey = "General"
Sub SaveVarToRegistry(ByVal KeyName As String, Value As Variant)
     SaveSetting cMainRegKey, cSubRegKey, KeyName, Value
End Sub
Function GetVarFromRegistry(ByVal KeyName) As Variant
     GetVarFromRegistry = GetSetting(cMainRegKey, _
         cSubRegKey, KeyName, "LEER")
End Function
Sub RemoveVarFromRegistry(ByVal KeyName As String)
     DeleteSetting cMainRegKey, cSubRegKey, KeyName
End Sub
Function GetVarsFromRegistry() As Variant
     GetVarsFromRegistry = GetAllSettings(cMainRegKey, _
         cSubRegKey)
End Function

Listing 1: Ausschnitt aus dem Modul zum Bearbeiten von Registry-Werten

Die Prozedur enthält nur eine Zeile mit der GetSetting-Funktion, der ihrerseits als Parameter aber zwei Konstanten übergeben werden, die oben im Kopf des Moduls global deklariert wurden: die Namen der Haupt- und Unterschlüssel. Denn diese dürften für die Datenbank konstant bleiben. Wenn Sie das Modul in eine andere Datenbank importieren, so ändern Sie dort nur diese zwei Konstanten. Das erspart Ihnen, überall im Code die Schlüsselnamen neu manuell einzufügen.

Die weiteren drei Prozeduren des Moduls arbeiten ähnlich und sind wohl selbsterklärend. Lediglich der GetVarsFromRegistry wäre gesonderte Aufmerksamkeit zu schenken. Sie verwendet die GetAllSettings-Funktion von VBA. Die Rückgabe ist ein Variant. Was sich hinter dieser Rückgabe verbirgt, macht die Prozedur TestGetAllVars deutlich:

Sub TestGetAllVars()
Dim i As Long
Dim V As Variant
V = GetVarsFromRegistry
For i = 0 To UBound(V, 1)
  Debug.Print _
    V(i, 0) & " = " & V(i, 1)
Next i
End Sub

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar