![]() |
||
![]() |
Mit Visual Basic in die Registry schreibenIch 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 lpdwDispositionAdresse 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 cbDataGröße des zu setzenden Wertes ); |
![]() |