Mit Visual Basic in die Registry schreiben

Ich habe versucht, mit Hilfe der VB-Funktion SaveSettings Einträge in der Registrierung zu speichern. Leider greift die Methode immer nur auf einen Zweig unterhalb des VB-Schlüssels zu. Um jedoch Einträge anderer Anwendungen zu ändern, muß ich auch auf Stellen zugreifen, die oberhalb des VB-Schlüssels liegen. Wie ist das möglich?

Dazu ist nur der Leistungsumfang von VB (Visual Basic) durch das Einbinden einiger Funktionen des Windows-API (Application Programing Interface) zu erweitern. Das API verfügt über Funktionen, die auch erlauben, was SaveSettings nicht bietet: Die freie Manipulation der Registrierungsdatei. Im Kasten äParameter der API-Funktionenô finden Sie die benötigten Funktionen und ihre Parameter.
Allerdings ist das Einbinden kompliziert. Um API-Funktionen von VB aus nutzen zu können, sind sie erst zu deklarieren. So weiß VB, in welchen Systembibliotheken es nach den Funktionen suchen muß. Für die Deklaration fügen Sie im allgemeinen Teil eines Moduls folgende Anweisungen ein:

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, lpSecurityAttributes As Long, phkResult As Long, lpdwDisposition As Long) As Long¶
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 ¶
Da jeder Parameter eine Definition des Datentyps benötigt, sehen die Deklarationen recht aufwendig aus. Anstelle des Datentyps Any für den Parameter lpData der Funktion RegSetValueEx können Sie auch den Datentyp String verwenden. Dann ist jedoch die Deklaration dieses Parameters um das Schlüsselwort ByVal zu ergänzen, also:
ByVal lpData As String¶
Damit Sie den Parametern die richtigen Werte übergeben können, sind noch einige Konstanten zu definieren. Sie benötigen zum Beispiel die Adresse des Schlüssels HKEY_LOCAL_MACHINE, um auf seinen Unterschlüssel zuzugreifen. Dazu erweitern Sie die Anweisungen im Deklarationsbereich durch die entsprechende Zeile aus dem Kasten äWichtige Konstantenô. Zudem brauchen Sie Deklarationen für den Klassentyp des zu übergebenden Parameters, etwa eine 1 für nullterminierte Unicode-Zeichenketten.
Public Const REG_SZ = 1¶
Weiterhin sind noch einige Konstanten zu deklarieren, die Windows für eine korrekte Spezifikation der Zugriffssicherheit benötigt. Im einzelnen können wir an dieser Stelle nicht auf das Sicherheitskonzept eingehen. Sie finden alle nötigen Konstanten im Kasten äWichtige Konstantenô. Da sie aufeinander aufbauen, übernehmen Sie einfach alle.
Stehen die Konstanten fest, legen Sie einen Schlüssel mit diesem Aufruf an:
ReturnValue = RegCreateKeyEx (HKEY_LOCAL_MACHINE, ôSoftware\MyAppô, 0, ôREG_SZô, 0, KEY_ALL_ACCESS, 0, hOfNewKey, 0)¶
Um dem Schlüssel einen Wert zuzuweisen, verwenden Sie diesen Befehl:
ReturnValue = RegSetValueEx (hOfNewKey, ôMyAppNameô, 0, 1, ôJipieee! It Works!ô, 13)¶
Wenn Sie kontrollieren wollen, ob die Anweisungen das gewünschte Ergebnis erzielen, starten Sie den Registry-Editor. Mit seiner Hilfe sehen Sie die Auswirkungen Ihrer Anweisung in der Registry.
Wichtige Konstanten
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 HKEY_PERFORMANCE_DATA = &H80000004
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_DYN_DATA = &H80000006
Konstanten für die Zugriffssicherheit
Public Const READ_CONTROL = &H20000
Public Const KEY_QUERY_VALUE = &H1
Public Const KEY_SET_VALUE = &H2
Public Const KEY_CREATE_SUB_KEY = &H4
Public Const KEY_ENUMERATE_SUB_KEYS = &H8
Public Const KEY_NOTIFY = &H10
Public Const KEY_CREATE_LINK = &H20
Public Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Public Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Public Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY))
Public Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY))
Public Const KEY_EXECUTE = (KEY_READ)
Public Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_WRITE Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK))

Parameter der API-Funktion
LONG RegCreateKeyEx (
HKEY
hKey,	Handle eines Registrierungsschlüssels
LPCTSTR
lpszSubKey,	Adresse eines Unterschlüssels
DWORD
dwReserved,	Reserviert für Windows
LPTSTR
lpszClass,	Adresse eines Klassenbezeichners
DWORD
fdwOptions,	Optionsparameter
REGSAM
samDesired,	Festlegen der Sicherheitsstufe
LPSECURITY_ATTRIBUTES
lpSecurityAttributes,	Adresse der Sicherheitsstruktur
PHKEY
phkResult,	Handle des erzeugten Schlüssels
LPDWORD
lpdwDisposition 	Adresse des neuen Inhalts
);
LONG RegSetValueEx (
HKEY
hKey,	Handle des zu bearbeitenden Schlüssels
LPCTSTR
lpValueName,	Adresse des zu setzenden Wertes
DWORD
Reserved,	Reserviert für Windows
DWORD
dwType,	Optionsparameter
CONST BYTE *
lpData,	Adresse des Wertes
DWORD
cbData 	Größe des zu setzenden Wertes
);