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
	);