{"id":55001323,"date":"2021-10-01T00:00:00","date_gmt":"2024-10-22T23:00:41","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1323"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Registry_per_VBA_32_und_64Bit","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/","title":{"rendered":"Registry per VBA, 32- und 64-Bit"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/0ccd8f848b2446588eb8147ead924b4e\" width=\"1\" height=\"1\" alt=\"\"><b>Die Registry von Windows ist f&uuml;r den einen oder anderen ein Buch mit sieben Siegeln. Tatsache ist: Dort landen manche wichtigen Informationen, die Sie gegebenenfalls einmal mit VBA auslesen wollen, oder Sie wollen daf&uuml;r sorgen, dass per VBA bestimmte Elemente in der Registry angelegt werden. Wir stellen einige Routinen vor, die Ihnen die Arbeit mit der Registry erleichtern. Gleichzeitig liefern wir den Code in 64-Bit-kompatibler Form.<\/b><\/p>\n<h2>Per VBA mit der Registry arbeiten<\/h2>\n<p>Wann und wo Sie auf eine Anforderung sto&szlig;en, die mit dem Lesen oder Schreiben von Registry-Werten per VBA zu tun hat, lassen wir einmal dahingestellt. Wichtig ist allein, dass Sie nach der Lekt&uuml;re dieses Beitrags auf den Ernstfall vorbereitet sind!<\/p>\n<p>Daher schauen wir uns in diesem Beitrag nicht nur einen Satz von Funktionen an, welche wiederum die API von Windows f&uuml;r den lesenden und schreibenden Zugriff auf die Registry nutzen, sondern liefern auch noch eine Reihe von Beispielen f&uuml;r die Anwendung dieser Funktionen.<\/p>\n<p>Unser konkreter Anlass, uns mit dem Thema VBA-Zugriff auf die Registry auseinanderzusetzen, war der Beitrag <b>Optionen per VBA f&uuml;r Access 2019 <\/b>(<b>www.access-im-unternehmen.de\/1320<\/b>). Hier haben wir untersucht, welche Einstellungen des Dialogs Access-Optionen in der Registry landen. Um schnell pr&uuml;fen zu k&ouml;nnen, ob sich nach dem &Auml;ndern einer Option unter Access einer der Eintr&auml;ge in der Registry ge&auml;ndert hat, haben wir eine Tabelle erstellt, die alle bereits in der Registry vorhandenen Werte enth&auml;lt. Diese Werte haben wir initial einmal aus dem entsprechenden Bereich der Registry ausgelesen.<\/p>\n<p>Anschlie&szlig;end haben wir nach jeder &Auml;nderung eine Prozedur durchlaufen lassen, welche alle Werte der Registry mit den bestehenden Werten in der Tabelle abgeglichen und eventuelle Unterschiede oder gar neue Werte im Direktbereich ausgegeben hat.<\/p>\n<h2>Access-Einstellungen in der Registry<\/h2>\n<p>Den Bereich der Registry, der die Access-Optionen enth&auml;lt, findet sich unter <b>HKEY_CURRENT_USER <\/b>im Ordner <b>SOFTWARE\\Microsoft\\Office\\16.0\\Access\\Settings<\/b>. Der Screenshot aus Bild 1 zeigt einige der Einstellungen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_05\/pic_1323_001.jpg\" alt=\"Dieser Bereich der Registry speichert die meisten der Access-Optionen.\" width=\"700\" height=\"404,1569\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Dieser Bereich der Registry speichert die meisten der Access-Optionen.<\/span><\/b><\/p>\n<p>Auf diesen Ordner wollen wir uns in diesem Beitrag konzentrieren &#8211; wie lesen die Informationen aus, legen neue Werte an, erstellen Unterordner und so weiter. Vorher schauen wir uns allerdings noch die dazu notwendigen Funktionen im Modul <b>mdlRegistry <\/b>an.<\/p>\n<h2>Das Modul mdlRegistry und die Registry-Funktionen<\/h2>\n<p>Da das Modul die Deklaration von API-Funktion enth&auml;lt sowie daf&uuml;r vorgesehene Wrapperfunktionen, ben&ouml;tigen wir auch einige <b>Enum<\/b>&#8211; und <b>Const<\/b>-Elemente. Diese sehen wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Enum Key\r\n     HKEY_CLASSES_ROOT = &H80000000\r\n     HKEY_CURRENT_USER = &H80000001\r\n     HKEY_LOCAL_MACHINE = &H80000002\r\n     HKEY_USERS = &H80000003\r\nEnd Enum\r\n<span style=\"color:blue;\">Public <\/span>Enum DataType\r\n     dtString = 1\r\n     dtNumber = 4\r\nEnd Enum\r\nGlobal Const ERROR_NONE = 0\r\nGlobal Const ERROR_BADDB = 1\r\nGlobal Const ERROR_BADKEY = 2\r\nGlobal Const ERROR_CANTOPEN = 3\r\nGlobal Const ERROR_CANTREAD = 4\r\nGlobal Const ERROR_CANTWRITE = 5\r\nGlobal Const ERROR_OUTOFMEMORY = 6\r\nGlobal Const ERROR_INVALID_PARAMETER = 7\r\nGlobal Const ERROR_ACCESS_DENIED = 8\r\nGlobal Const ERROR_INVALID_PARAMETERS = 87\r\nGlobal Const ERROR_NO_MORE_ITEMS = 259\r\nGlobal Const KEY_ALL_ACCESS = &H3F\r\nGlobal Const REG_OPTION_NON_VOLATILE = 0<\/pre>\n<p>Neben diesen Elementen ben&ouml;tigen wir die Deklarationen der eigentlichen API-Funktionen. Dabei handelt es sich um 13 Funktionen, deren Deklaration Sie in Listing 1 finden.<\/p>\n<pre>Declare PtrSafe Function RegCloseKey Lib \"advapi32.dll\" (ByVal hKey<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\nDeclare PtrSafe Function RegCreateKeyEx Lib \"advapi32.dll\" Alias \"RegCreateKeyExA\" (ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpSubKey<span style=\"color:blue;\"> As String<\/span>, ByVal Reserved<span style=\"color:blue;\"> As Long<\/span>, ByVal lpClass<span style=\"color:blue;\"> As String<\/span>, ByVal dwOptions<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal samDesired<span style=\"color:blue;\"> As Long<\/span>, ByVal lpSecurityAttributes<span style=\"color:blue;\"> As Long<\/span>, phkResult<span style=\"color:blue;\"> As Long<\/span>, lpdwDisposition<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\nDeclare PtrSafe Function RegOpenKeyEx Lib \"advapi32.dll\" Alias \"RegOpenKeyExA\" (ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpSubKey<span style=\"color:blue;\"> As String<\/span>, ByVal ulOptions<span style=\"color:blue;\"> As Long<\/span>, ByVal samDesired<span style=\"color:blue;\"> As Long<\/span>, phkResult<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\nDeclare PtrSafe Function RegQueryValueExString Lib \"advapi32.dll\" Alias \"RegQueryValueExA\" (ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpValueName<span style=\"color:blue;\"> As String<\/span>, ByVal lpReserved<span style=\"color:blue;\"> As Long<\/span>, lpType<span style=\"color:blue;\"> As Long<\/span>, ByVal lpData<span style=\"color:blue;\"> As String<\/span>, lpcbData<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\nDeclare PtrSafe Function RegQueryValueExLong Lib \"advapi32.dll\" Alias \"RegQueryValueExA\" (ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpValueName<span style=\"color:blue;\"> As String<\/span>, ByVal lpReserved<span style=\"color:blue;\"> As Long<\/span>, lpType<span style=\"color:blue;\"> As Long<\/span>, lpData<span style=\"color:blue;\"> As Long<\/span>, lpcbData<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\nDeclare PtrSafe Function RegQueryValueExNULL Lib \"advapi32.dll\" Alias \"RegQueryValueExA\" (ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpValueName<span style=\"color:blue;\"> As String<\/span>, ByVal lpReserved<span style=\"color:blue;\"> As Long<\/span>, lpType<span style=\"color:blue;\"> As Long<\/span>, ByVal lpData<span style=\"color:blue;\"> As Long<\/span>, lpcbData<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\nDeclare PtrSafe Function RegSetValueExString Lib \"advapi32.dll\" Alias \"RegSetValueExA\" (ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpValueName<span style=\"color:blue;\"> As String<\/span>, ByVal Reserved<span style=\"color:blue;\"> As Long<\/span>, ByVal dwType<span style=\"color:blue;\"> As Long<\/span>, ByVal lpValue<span style=\"color:blue;\"> As String<\/span>, _\r\n     ByVal cbData<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\nDeclare PtrSafe Function RegSetValueExLong Lib \"advapi32.dll\" Alias \"RegSetValueExA\" (ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpValueName<span style=\"color:blue;\"> As String<\/span>, ByVal Reserved<span style=\"color:blue;\"> As Long<\/span>, ByVal dwType<span style=\"color:blue;\"> As Long<\/span>, lpValue<span style=\"color:blue;\"> As Long<\/span>, ByVal cbData<span style=\"color:blue;\"> As Long<\/span>) _\r\n    <span style=\"color:blue;\"> As Long<\/span>\r\nDeclare PtrSafe Function RegDeleteKey& Lib \"advapi32.dll\" Alias \"RegDeleteKeyA\" (ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpSubKey<span style=\"color:blue;\"> As String<\/span>)\r\nDeclare PtrSafe Function RegDeleteValue& Lib \"advapi32.dll\" Alias \"RegDeleteValueA\" (ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpValueName<span style=\"color:blue;\"> As String<\/span>)\r\nDeclare PtrSafe Function RegOpenKey Lib \"advapi32.dll\" Alias \"RegOpenKeyA\" (ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpSubKey<span style=\"color:blue;\"> As String<\/span>, phkResult<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\nDeclare PtrSafe Function RegEnumKeyEx Lib \"advapi32.dll\" Alias \"RegEnumKeyExA\" (ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal dwIndex<span style=\"color:blue;\"> As Long<\/span>, ByVal lpName<span style=\"color:blue;\"> As String<\/span>, lpcbName<span style=\"color:blue;\"> As Long<\/span>, ByVal lpReserved<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpClass<span style=\"color:blue;\"> As String<\/span>, lpcbClass<span style=\"color:blue;\"> As Long<\/span>, lpftLastWriteTime<span style=\"color:blue;\"> As <\/span>Any)<span style=\"color:blue;\"> As Long<\/span>\r\nDeclare PtrSafe Function RegEnumValue Lib \"advapi32.dll\" Alias \"RegEnumValueA\" (ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal dwIndex<span style=\"color:blue;\"> As Long<\/span>, ByVal lpValueName<span style=\"color:blue;\"> As String<\/span>, lpcbValueName<span style=\"color:blue;\"> As Long<\/span>, ByVal lpReserved<span style=\"color:blue;\"> As Long<\/span>, _\r\n     lpType<span style=\"color:blue;\"> As Long<\/span>, lpData<span style=\"color:blue;\"> As Byte<\/span>, lpcbData<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Die ben&ouml;tigten API-Funktionen<\/span><\/b><\/p>\n<h2>Wrapperfunktion zum Auslesen von Werten<\/h2>\n<p>Die erste Wrapperfunktion soll das Auslesen eines Wertes f&uuml;r einen Eintrag eines Schl&uuml;ssels\/Unterschl&uuml;ssels erm&ouml;glich. Diese Funktion erwartet drei Parameter:<\/p>\n<ul>\n<li><b>lngKey<\/b>: Einen der Werte der <b>Enum<\/b>-Auflistung <b>Key<\/b>, zum Beispiel <b>HKEY_CURRENT_USER<\/b><\/li>\n<li><b>strKeyName<\/b>: Den Unterschl&uuml;ssel, zum Beispiel <b>SOFTWARE\\Microsoft\\Office\\16.0\\Access\\Settings<\/b><\/li>\n<li><b>strValueName<\/b>: Den Namen des zu ermittelnden Elements, zum Beispiel <b>Form Template<\/b><\/li>\n<\/ul>\n<p>Die Funktion nutzt die API-Funktion <b>RegOpenKeyEx<\/b>, um den angegebenen Schl&uuml;ssel zu &ouml;ffnen. Dann liest sie mit <b>RegQueryValueEx <\/b>das gew&uuml;nschte Element aus. Der Parameter <b>varValue <\/b>nimmt den gesuchten Wert auf.<\/p>\n<p>Dieser wird in den folgenden Schritten noch untersucht und von nicht erw&uuml;nschten Zeichen befreit. Schlie&szlig;lich wird dieser Wert zur&uuml;ckgegeben und der Registry-Schl&uuml;ssel mit der API-Funktion <b>RegCloseKey <\/b>wieder geschlossen (siehe Listing 2)<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>QueryValue(lngKey<span style=\"color:blue;\"> As <\/span>Key, strKeyName<span style=\"color:blue;\"> As String<\/span>, strValueName<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngRetVal<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>hKey<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>varValue<span style=\"color:blue;\"> As Variant<\/span>\r\n     lngRetVal = RegOpenKeyEx(lngKey, strKeyName, 0, KEY_ALL_ACCESS, hKey)\r\n     lngRetVal = QueryValueEx(hKey, strValueName, varValue)\r\n     varValue = <span style=\"color:blue;\">Trim<\/span>(varValue)\r\n     <span style=\"color:blue;\">If <\/span>varValue &lt;&gt; \"\"<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>Asc(<span style=\"color:blue;\">Right<\/span>(varValue, 1)) &gt; 127<span style=\"color:blue;\"> Then<\/span>\r\n             varValue = <span style=\"color:blue;\">Left<\/span>(varValue, <span style=\"color:blue;\">Len<\/span>(varValue) - 1)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span>varValue &lt;&gt; \"\"<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>Asc(<span style=\"color:blue;\">Right<\/span>(varValue, 1)) &lt; 21<span style=\"color:blue;\"> Then<\/span>\r\n             varValue = <span style=\"color:blue;\">Left<\/span>(varValue, <span style=\"color:blue;\">Len<\/span>(varValue) - 1)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     QueryValue = varValue\r\n     RegCloseKey hKey\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Die Wrapperfunktion QueryValue<\/span><\/b><\/p>\n<h2>Wrapperfunktion zum Auslesen aller Eintr&auml;ge eines Schl&uuml;ssels<\/h2>\n<p>Die Wrapperfunktion <b>EnumKeyValues<\/b> ermittelt alle Eintr&auml;ge der mit den Parametern &uuml;bergebenen Schl&uuml;ssel\/Unterschl&uuml;ssel-Kombination.<\/p>\n<p>Die Funktion erwartet diese beiden Parameter:<\/p>\n<ul>\n<li><b>lngKey<\/b>: Einen der Werte der <b>Enum<\/b>-Auflistung <b>Key<\/b>, zum Beispiel <b>HKEY_CURRENT_USER<\/b><\/li>\n<li><b>strKeyName<\/b>: Den Unterschl&uuml;ssel, zum Beispiel <b>SOFTWARE\\Microsoft\\Office\\16.0\\Access\\Settings<\/b><\/li>\n<\/ul>\n<p>Die Funktion &ouml;ffnet wieder mit <b>RegOpenKey <\/b>den Schl&uuml;ssel. Dann startet sie eine <b>Do&#8230;Loop<\/b>-Schleife, die dann endet, wenn die Funktion <b>RegEnumValue <\/b>den Wert <b>0 <\/b>zur&uuml;ckgibt. Diese erh&auml;lt in der Schleife wiederum einen Index als zweiten Parameter, der mit jedem Schleifendurchlauf erh&ouml;ht wird, sowie als dritten Parameter eine mit 255 Leerzeichen vorbelegte Zeichenkette. Diese wird, sofern der aktuelle Index aus <b>lngIndex<\/b> ein g&uuml;ltiges Ergebnis hergibt, mit dem Namen des Eintrags gef&uuml;llt. Der Inhalt von <b>strSave <\/b>wird dann mit der Funktion <b>StripTerminator <\/b>von <b>vbNullChar<\/b>-Zeichen befreit und an das Array <b>strKeys <\/b>angeh&auml;ngt. Dieses gibt die Funktion schlie&szlig;lich als Ergebnis zur&uuml;ck:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>EnumKeyValues(lngKey<span style=\"color:blue;\"> As <\/span>Key, _\r\n         strSubkey<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>()\r\n     <span style=\"color:blue;\">Dim <\/span>hKey<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngIndex<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSave<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strKeys()<span style=\"color:blue;\"> As String<\/span>\r\n     RegOpenKey lngKey, strSubkey, hKey\r\n     Do\r\n         strSave = String(255, 0)\r\n         If RegEnumValue(hKey, lngIndex, strSave, 255, _\r\n                 0, ByVal 0&, ByVal 0&, ByVal 0&) &lt;&gt; 0 Then\r\n             <span style=\"color:blue;\">Exit Do<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             ReDim Preserve strKeys(lngIndex)\r\n             strKeys(lngIndex) = StripTerminator(strSave)\r\n             lngIndex = lngIndex + 1\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     RegCloseKey hKey\r\n     EnumKeyValues = strKeys\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Die Hilfsfunktion StripTerminator<\/h2>\n<p>Die in der vorher vorgestellten Funktion verwendete Hilfsfunktion <b>StripTerminator <\/b>befreit die &uuml;bergebene Zeichenkette von Vorkommen des Zeichens <b>vbNullChar<\/b>. Die API-Funktion <b>RegEnumValue <\/b>ersetzt in der <b>String<\/b>-Variablen <b>strSave <\/b>die 255 Leerzeichen durch das Ergebnis und f&uuml;llt die &uuml;brigen Zeichen mit dem Zeichen <b>vbNullChar <\/b>auf. Diese wollen wir entfernen und verwenden dazu die Funktion <b>StripTerminator<\/b>. Die Funktion erwartet die zu untersuchende Zeichenkette als Parameter und gibt die &uuml;berarbeitete Zeichenkette zur&uuml;ck. Sie sucht im ersten Schritt nach dem ersten Vorkommen von <b>vbNullChar <\/b>und geht davon aus, dass hier das eigentliche Ergebnis beendet ist. Die Suche erledigt sie mit der Funktion <b>InStr<\/b>, welche die Position des ersten Vorkommens zur&uuml;ckliefert. Ist das Ergebnis gr&ouml;&szlig;er als <b>0<\/b>, wurde ein <b>vbNullChar<\/b>-Zeichen gefunden. Dann schneidet die Funktion alle Zeichen von diesem Zeichen an ab und tr&auml;gt nur die davor liegenden Zeichen in den R&uuml;ckgabewert der Funktion ein. Andernfalls erh&auml;lt dieser einfach die &uuml;bergebene Zeichenkette als Ergebnis:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>StripTerminator(strInput<span style=\"color:blue;\"> As String<\/span>) _\r\n        <span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngPosNull<span style=\"color:blue;\"> As Long<\/span>\r\n     lngPosNull = <span style=\"color:blue;\">InStr<\/span>(1, strInput, vbNullChar)\r\n     <span style=\"color:blue;\">If <\/span>lngPosNull &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         StripTerminator = Left$(strInput, lngPosNull - 1)\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         StripTerminator = strInput\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Wrapperfunktion zum Auslesen aller Unterschl&uuml;ssel eines Schl&uuml;ssels<\/h2>\n<p>Wenn Sie alle Schl&uuml;ssel unterhalb eines anderen Schl&uuml;ssels auslesen m&ouml;chten, k&ouml;nnen Sie dazu die Wrapperfunktion <b>EnumRegKeys <\/b>nutzen (siehe Listing 3). Diese Funktion erwartet die gleichen Parameter wie die Funktion <b>EnumKeyValues<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>EnumRegKeys(lngKey<span style=\"color:blue;\"> As <\/span>Key, strKeyName<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>()\r\n     <span style=\"color:blue;\">Dim <\/span>hKey<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngIndex<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSave<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strKeys()<span style=\"color:blue;\"> As String<\/span>\r\n    RegOpenKey lngKey, strKeyName, hKey\r\n     Do\r\n         strSave = String(255, 0)\r\n         <span style=\"color:blue;\">If <\/span>RegEnumKeyEx(hKey, lngIndex, strSave, 255, 0, vbNullString, ByVal 0&, ByVal 0&) &lt;&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             ReDim Preserve strKeys(lngIndex)\r\n             strKeys(lngIndex) = StripTerminator(strSave)\r\n             lngIndex = lngIndex + 1\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">Exit Do<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     RegCloseKey hKey\r\n     EnumRegKeys = strKeys\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Die Wrapperfunktion zum Auslesen aller untergeordneten Schl&uuml;ssel<\/span><\/b><\/p>\n<p>Sie &ouml;ffnet mit der API-Funktion <b>RegOpenKey <\/b>den zu untersuchenden Schl&uuml;ssel. Dann durchl&auml;uft sie eine <b>Do Loop<\/b>-Schleife solange, bis kein weiterer untergeordneter Schl&uuml;ssel mehr gefunden werden kann.<\/p>\n<p>Dabei f&uuml;llt sie die Variable <b>strSave<\/b>, die mit dem jeweiligen Namen des Unterschl&uuml;ssels gef&uuml;llt werden soll, mit 255 Leerzeichen. Dann pr&uuml;ft sie in einer <b>If&#8230;Then<\/b>-Bedingung das Ergebnis der API-Funktion <b>RegEnumKeyEx<\/b>.<\/p>\n<p>Ist dieses <b>0<\/b>, wurde f&uuml;r den Index mit dem Wert aus <b>lngIndex <\/b>ein Unterschl&uuml;ssel gefunden.<\/p>\n<p>Dann vergr&ouml;&szlig;ert die Funktion im <b>If<\/b>-Teil der Bedingung das Array <b>strKeys <\/b>f&uuml;r die Ergebnisse auf den aktuellen Index aus <b>lngIndex <\/b>und f&uuml;gt den Namen des mit <b>strSave <\/b>ermittelten Unterschl&uuml;ssels an der neuen Position in das Array ein. Zuvor entfernt die Funktion <b>StripTerminator <\/b>wieder die &uuml;berz&auml;hligen <b>vbNullChar<\/b>-Zeichen aus <b>strSave<\/b>.<\/p>\n<p>Liefert <b>RegEnumKeyEx <\/b>f&uuml;r den aktuellen Index den Wert <b>0 <\/b>zur&uuml;ck, ist kein weiterer Unterschl&uuml;ssel mehr vorhanden und der untersuchte Schl&uuml;ssel wird mit <b>RegCloseKey <\/b>geschlossen.<\/p>\n<h2>Wrapperfunktion zum Erzeugen eines neuen Schl&uuml;ssels<\/h2>\n<p>Einen neuen Schl&uuml;ssel anzulegen bedeutet in der Sprache der Registry, dass Sie einen neuen Ordner im linken Bereich erstellen wollen. Das gelingt viel einfacher als bei Ordnern im Dateisystem.<\/p>\n<p>Sie brauchen einfach nur den Hauptschl&uuml;ssel festzulegen und dann den Unterschl&uuml;ssel zu definieren &#8211; egal, ob dieser noch &uuml;bergeordnete Schl&uuml;ssel hat. Sie k&ouml;nnen damit auch in einem Schritt mehrere verschachtelte Schl&uuml;ssel anlegen, also beispielsweise <b>Test1\\Test2\\Test3<\/b>.<\/p>\n<p>Schauen wir uns die Funktion an, die dies erlaubt &#8211; siehe Listing 4. Die Funktion erwartet zwei Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>CreateNewKey(lngKey<span style=\"color:blue;\"> As <\/span>Key, strNewSubkey<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>hNewKey<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngRetVal<span style=\"color:blue;\"> As Long<\/span>\r\n     lngRetVal = RegCreateKeyEx(lngKey, strNewSubkey, 0&, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, _\r\n         0&, hNewKey, lngRetVal)\r\n     RegCloseKey hNewKey\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Die Wrapperfunktion zum Erstellen eines Wertes<\/span><\/b><\/p>\n<ul>\n<li><b>lngKey<\/b>: der Hauptschl&uuml;ssel, also ein Element der Enum-Auflistung <b>Key <\/b>wie <b>HKEY_CURRENT_USER<\/b><\/li>\n<li><b>strNewSubkey<\/b>: der neu anzulegenden Schl&uuml;ssel<\/li>\n<\/ul>\n<p>Die Funktion ruft ohne Umschweife die API-Funktion <b>RegCreateKeyEx <\/b>auf, der sie den ersten und den zweiten Parameter neben einigen anderen Werten als Funktionsparameter &uuml;bergibt.<\/p>\n<p>Im Gegensatz zu den ersten Wrapperfunktionen taucht hier kein Aufruf der Funktion <b>RegOpenKey <\/b>auf, was nicht n&ouml;tig ist, da wir ja erst einen Schl&uuml;ssel erstellen wollen.<\/p>\n<p>Dennoch wird beim Anlegen der Schl&uuml;ssel &#8222;ge&ouml;ffnet&#8220;, was dazu f&uuml;hrt, dass dieser auch geschlossen werden muss.<\/p>\n<p>Die API-Funktion <b>RegCreateKeyEx <\/b>liefert daher mit dem Parameter <b>hNewKey <\/b>ein Handle auf den neuen Schl&uuml;ssel zur&uuml;ck, das dann mit <b>RegCloseKey <\/b>zum Schlie&szlig;en verwendet werden kann.<\/p>\n<h2>Wrapperfunktion zum Erzeugen eines neuen Eintrags mit Wert<\/h2>\n<p>Nun wollen wir einem bestehenden Schl&uuml;ssel einen neuen Eintrag mit Wert hinzuf&uuml;gen. Dazu nutzen wir eine weitere Wrapperfunktion namens <b>AddKeyAndValue<\/b> (siehe Listing 5). Diese erwartet neben den bereits bekannten Parametern drei weitere Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AddKeyAndValue(lngKey<span style=\"color:blue;\"> As <\/span>Key, strSubkey<span style=\"color:blue;\"> As String<\/span>, strValueName<span style=\"color:blue;\"> As String<\/span>, strValue<span style=\"color:blue;\"> As String<\/span>, _\r\n         lngValueType<span style=\"color:blue;\"> As <\/span>DataType)\r\n     <span style=\"color:blue;\">Dim <\/span>lngRetVal<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>hKey<span style=\"color:blue;\"> As Long<\/span>\r\n     lngRetVal = RegOpenKeyEx(lngKey, strSubkey, 0, KEY_ALL_ACCESS, hKey)\r\n     lngRetVal = SetValueEx(hKey, strValueName, lngValueType, strValue)\r\n     RegCloseKey hKey\r\n<span style=\"color:blue;\">End Function<\/span> <\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Die Wrapperfunktion zum Anlegen eines neuen Eintrags mit Wert <\/span><\/b><\/p>\n<ul>\n<li><b>strValueName<\/b>: Name des neuen Eintrags<\/li>\n<li><b>strValue<\/b>: Wert des neuen Eintrags<\/li>\n<li><b>lngValueType<\/b>: Datentyp des neuen Eintrag aus der <b>Enum<\/b>-Auflistung <b>DataType<\/b><\/li>\n<\/ul>\n<p>Damit ausgestattet &ouml;ffnet die Funktion mit der API-Funktion <b>RegOpenKeyEx <\/b>erst einmal den mit den ersten beiden Parametern angegebenen Unterschl&uuml;ssel und speichert das Handle auf diesen Schl&uuml;ssel in der Variablen <b>hKey<\/b>. Danach ruft es eine weitere API-Funktion namens <b>SetValueEx <\/b>auf. Diese erh&auml;lt Handle, Eintrag, Wert und Datentyp und legt den neuen Eintrag an.<\/p>\n<h2>Wrapperfunktion zum Einstellen eines Wertes f&uuml;r einen vorhandenen Eintrag<\/h2>\n<p>Vielleicht m&ouml;chten Sie auch einen vorhandenen Eintrag mit einem neuen Wert versehen. Dabei unterst&uuml;tzt uns die Wrapperfunktion <b>SetValue<\/b> (siehe Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>SetValue(ByVal lngKey<span style=\"color:blue;\"> As Long<\/span>, strSubkey<span style=\"color:blue;\"> As String<\/span>, strValueName<span style=\"color:blue;\"> As String<\/span>, varValue<span style=\"color:blue;\"> As Variant<\/span>, _\r\n         lngDataType<span style=\"color:blue;\"> As <\/span>DataType)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngValue<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strValue<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngRetVal<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>hkey<span style=\"color:blue;\"> As Long<\/span>\r\n     lngRetVal = RegOpenKeyEx(lngKey, strSubkey, 0, KEY_ALL_ACCESS, hkey)\r\n     Select Case lngDataType\r\n         <span style=\"color:blue;\">Case <\/span>dtString\r\n             strValue = varValue\r\n             SetValue = RegSetValueExString(hkey, strValueName, 0&, lngDataType, strValue, <span style=\"color:blue;\">Len<\/span>(strValue))\r\n         <span style=\"color:blue;\">Case <\/span>dtNumber\r\n             lngValue = varValue\r\n             SetValue = RegSetValueExLong(hkey, strValueName, 0&, lngDataType, lngValue, 4)\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     RegCloseKey hKey\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Die Wrapperfunktion zum Einstellen eines Wertes f&uuml;r einen vorhandenen Eintrag<\/span><\/b><\/p>\n<p>Diese erwartet die gleichen Parameter wie die Funktion <b>AddKeyAndValue<\/b>. Aus den beiden Parametern f&uuml;r den Haupt- und den Unterschl&uuml;ssel ermittelt sie zun&auml;chst mit der API-Funktion <b>RegOpenKeyEx <\/b>ein Handle auf diesen Schl&uuml;ssel.<\/p>\n<p>Dann untersucht sie den mit dem letzten Parameter &uuml;bergebenen Datentyp in einer <b>Select Case<\/b>-Bedingung. Im Fall des <b>String<\/b>-Datentyps schreibt Sie den Inhalt des Parameters <b>varValue <\/b>in die Variable <b>strValue<\/b>.<\/p>\n<p>Dann ruft sie die API-Funktion <b>RegSetValueExString<\/b> auf und &uuml;bergibt alle relevanten Informationen. Das Ergebnis landet im R&uuml;ckgabewert der Wrapperfunktion.<\/p>\n<p>Sollte es sich um einen Zahlendatentyp handeln, schreibt die Prozedur den Inhalt von <b>varValue <\/b>in <b>lngValue<\/b> und &uuml;bergibt diesen an die API-Funktion <b>RegSetValueExLong<\/b>. Auch hier tr&auml;gt die Funktion das Ergebnis als R&uuml;ckgabewert ein.<\/p>\n<p>Zuletzt schlie&szlig;t die Funktion das Handle wieder mit der API-Funktion <b>RegCloseKey<\/b>.<\/p>\n<h2>Wrapperfunktion zum L&ouml;schen eines Eintrags<\/h2>\n<p>Die Funktion <b>DeleteValue <\/b>aus Listing 7 dient dem L&ouml;schen eines Unterschl&uuml;ssels. Sie erwartet wiederum den Schl&uuml;ssel und den Unterschl&uuml;ssel als Parameter. Au&szlig;erdem geben Sie den Namen des Eintrags als dritten Parameter an.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DeleteValue(lngKey<span style=\"color:blue;\"> As <\/span>Key, strSubkey<span style=\"color:blue;\"> As String<\/span>, strValueName<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngRetVal<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>hKey<span style=\"color:blue;\"> As Long<\/span>\r\n     lngRetVal = RegOpenKeyEx(lngKey, strSubkey, 0, KEY_ALL_ACCESS, hKey)\r\n     lngRetVal = RegDeleteValue(hKey, strValueName)\r\n     RegCloseKey (hKey)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Die Wrapperfunktion zum L&ouml;schen eines Unterschl&uuml;ssels<\/span><\/b><\/p>\n<p>Die Funktion &ouml;ffnet den Schl&uuml;ssel mit der API-Funktion <b>RegOpenKeyEx <\/b>und erh&auml;lt so mit <b>hKey <\/b>ein Handle auf den Unterschl&uuml;ssel. Diesen nutzt die n&auml;chste Anweisung, die mit der API-Funktion <b>RegDeleteValue <\/b>den Wert l&ouml;scht. Diese erwartet als ersten Parameter das Handle auf den betroffenen Unterschl&uuml;ssel und mit dem zweiten den Namen des zu l&ouml;schenden Eintrags.<\/p>\n<h2>Wrapperfunktion zum L&ouml;schen eines Unterschl&uuml;ssels<\/h2>\n<p>Die Wrapperfunktion <b>DeleteKey <\/b>erwartet lediglich den Haupt- und den zu l&ouml;schenden Unterschl&uuml;ssel als Parameter.<\/p>\n<p>Diese gibt sie weiter an die API-Funktion <b>RegDeleteKey<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DeleteKey(lngKey<span style=\"color:blue;\"> As <\/span>Key,  strSubkey<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lRetVal<span style=\"color:blue;\"> As Long<\/span>\r\n     lRetVal = RegDeleteKey(lngKey, subKey)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Beispiel f&uuml;r das Auslesen eines Wertes<\/h2>\n<p>Wenn wir einen Wert aus der Registry auslesen m&ouml;chten, dessen Ordner wir kennen, ben&ouml;tigen wir die Funktion <b>QueryValue<\/b>. Diese erwartet als Parameter den Key, den Subkey sowie den Wertnamen. Wir verwenden den bereits erw&auml;hnten Bereich und wollen hier den Inhalt des Eintrags <b>Form Template <\/b>ermitteln:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> QueryValue(HKEY_CURRENT_USER, \"SOFTWARE\\Microsoft\\Office\\16.0\\Access\\Settings\", \"Form Template\")\r\nNormal<\/pre>\n<p>Das Ergebnis lautet <b>Normal<\/b>.<\/p>\n<h2>Beispiel zum Auslesen der Eintr&auml;ge eines Unterschl&uuml;ssels<\/h2>\n<p>Um herauszufinden, welche Eintr&auml;ge sich in einem Unterschl&uuml;ssel befinden, ben&ouml;tigen wir die Funktion <b>EnumKeyValues<\/b>. Diese erwartet nur den Hauptschl&uuml;ssel und den Unterschl&uuml;ssel und liefert ein Array mit den Namen aller Eintr&auml;ge zur&uuml;ck.<\/p>\n<p>Ein Beispiel f&uuml;r die Nutzung der Funktion <b>EnumKeyValues <\/b>sieht wie folgt aus. Wir deklarieren ein Array namens <b>strWerte<\/b>. Dieses f&uuml;llen wir direkt mit dem Ergebnis der Funktion <b>EnumKeyValues<\/b>. Anschlie&szlig;end durchlaufen wir eine <b>For Next<\/b>-Schleife &uuml;ber die Grenzwerte des Arrays und geben jeweils den Namen des Eintrags aus.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>WerteEinesBereichsDurchlaufen()\r\n     <span style=\"color:blue;\">Dim <\/span>strWerte()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     strWerte = EnumKeyValues(HKEY_CURRENT_USER,  \"SOFTWARE\\Microsoft\\Office\\16.0\\Access\\Settings\")\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(strWerte) To <span style=\"color:blue;\">UBound<\/span>(strWerte)\r\n         <span style=\"color:blue;\">Debug.Print<\/span> strWerte(i)\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die ersten paar Eintr&auml;ge in einer recht jungfr&auml;ulichen Registry lauten beispielsweise:<\/p>\n<pre>LastUILang\r\nTDPopPropST\r\nECLST\r\nPrefs Migrated\r\nMaximized\r\n...<\/pre>\n<h2>Beispiel zum Auslesen der Unterschl&uuml;ssel eines Schl&uuml;ssels<\/h2>\n<p>Wenn Sie nicht die Eintr&auml;ge und Werte eines Schl&uuml;ssels herausfinden, sondern die in diesem enthaltenen weiteren Unterschl&uuml;ssel, verwenden wir die Wrapperfunktion <b>EnumRegKeys<\/b>.<\/p>\n<p>Diese erwartet wieder den Hauptschl&uuml;ssel und den zu untersuchenden Unterschl&uuml;ssel. Die folgende Prozedur soll alle Unterschl&uuml;ssel des Schl&uuml;ssels <b>SOFTWARE\\Microsoft\\Office\\16.0\\Access <\/b>in <b>HKEY_CURRENT_USERS <\/b>zur&uuml;ckgeben. <\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>UnterschluesselEinesBereichsDurchlaufen()\r\n     <span style=\"color:blue;\">Dim <\/span>strWerte()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     strWerte = EnumRegKeys(HKEY_CURRENT_USER, _\r\n         \"SOFTWARE\\Microsoft\\Office\\16.0\\Access\")\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(strWerte) To <span style=\"color:blue;\">UBound<\/span>(strWerte)\r\n         <span style=\"color:blue;\">Debug.Print<\/span> strWerte(i)\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn Sie die Unterschl&uuml;ssel eines Hauptschl&uuml;ssels ermitteln wollen, &uuml;bergeben Sie als Unterschl&uuml;ssel eine leere Zeichenkette:<\/p>\n<pre>...\r\nstrWerte = EnumRegKeys(HKEY_CURRENT_USER, \"\")\r\n...<\/pre>\n<h2>Beispiel zum Anlegen eines neuen Unterschl&uuml;ssels<\/h2>\n<p>Einen neuen Unterschl&uuml;ssel legen wir mit der API recht einfach an. Weiter oben haben Sie schon das Werkzeug dazu kennengelernt: die Wrapperfunktion <b>CreateNewKey<\/b>. Dieser &uuml;bergeben wir den Hauptschl&uuml;ssel sowie den zu erzeugenden Unterschl&uuml;ssel.<\/p>\n<p>Hier ist zu beachten, dass Sie den kompletten Unterschl&uuml;ssel benennen m&uuml;ssen, also auch eventuell bereits bestehende &uuml;bergeordnete Schl&uuml;ssel. Wenn wir also im bestehenden Unterschl&uuml;ssel <b>SOFTWARE\\Microsoft\\Office\\16.0\\Access\\Settings <\/b>einen neuen Schl&uuml;ssel namens <b>Neuer Schluessel <\/b>anlegen wollen, dann geben wir f&uuml;r den zu erzeugenden Unterschl&uuml;ssel den folgenden Ausdruck an:<\/p>\n<pre>SOFTWARE\\Microsoft\\Office\\16.0\\Access\\Settings\\Neuer Schluessel<\/pre>\n<p>Wenn Sie nur <b>Neuer Schluessel <\/b>angeben, wird ein komplett neuer Schl&uuml;ssel unterhalb des Hauptschl&uuml;ssels angelegt!<\/p>\n<p>Eine Beispielfunktion hierzu sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>EinenSchluesselAnlegen()\r\n     <span style=\"color:blue;\">Dim <\/span>strSchluessel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngHauptschluessel<span style=\"color:blue;\"> As <\/span>Key\r\n     strSchluessel = \"SOFTWARE\\Microsoft\\Office\\16.0\\ Access\\Settings\\Neuer Schluessel\"\r\n     lngHauptschluessel = HKEY_CURRENT_USER\r\n     CreateNewKey lngHauptschluessel, strSchluessel\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies legt den neuen Schl&uuml;ssel wie in Bild 2 an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_05\/pic_1323_002.jpg\" alt=\"Ein neuer Schl&uuml;ssel in den Access-Einstellungen\" width=\"649,559\" height=\"367,9582\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Ein neuer Schl&uuml;ssel in den Access-Einstellungen<\/span><\/b><\/p>\n<h2>Beispiel zum Anlegen eines neuen Eintrags mit Wert<\/h2>\n<p>Das n&auml;chste Beispiel soll f&uuml;r einen bestehenden Unterschl&uuml;ssel einen neuen Eintrag mit Wert anlegen. Die Prozedur nutzt die Wrapperfunktion <b>AddKeyAndValue <\/b>und &uuml;bergibt dieser den Schl&uuml;ssel, den Unterschl&uuml;ssel, den Eintrag, den Wert und den Datentyp:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>EinenEintragMitWertAnlegen()\r\n     <span style=\"color:blue;\">Dim <\/span>lngHauptschluessel<span style=\"color:blue;\"> As <\/span>Key\r\n     <span style=\"color:blue;\">Dim <\/span>strSchluessel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strEintrag<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strWert<span style=\"color:blue;\"> As String<\/span>\r\n     lngHauptschluessel = HKEY_CURRENT_USER\r\n     strSchluessel = \"SOFTWARE\\Microsoft\\Office\\16.0\\ Access\\Settings\\Neuer Schluessel\"\r\n     strEintrag = \"Neuer Eintrag\"\r\n     strWert = \"Neuer Wert\"\r\n     AddKeyAndValue lngHauptschluessel, strSchluessel, _\r\n         strEintrag, strWert, dtString\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Der neue Eintrag sieht anschlie&szlig;end wie in Bild 3 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_05\/pic_1323_003.jpg\" alt=\"Ein neuer Eintrag in der Registry\" width=\"649,559\" height=\"315,3927\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Ein neuer Eintrag in der Registry<\/span><\/b><\/p>\n<h2>Beispiel zum &Auml;ndern des Wertes eines vorhandenen Eintrags<\/h2>\n<p>Das n&auml;chste Beispiel untersucht das &Auml;ndern eines Wertes in der Registry. Dies k&ouml;nnte beispielsweise interessant sein, wenn Sie Access-Optionen per VBA &auml;ndern wollen, um den Optionen-Dialog zu umgehen.<\/p>\n<p>In einem weiteren Beitrag namens <b>Access-Optionen per Ribbon &auml;ndern <\/b>(<b>www.access-im-unternehmen.de\/1327<\/b>) zeigen wir, wie Sie das praktisch einsetzen k&ouml;nnen.<\/p>\n<p>Die Prozedur stellt die Parameter f&uuml;r den Aufruf der Wrapper-Funktion <b>SetValue<\/b> zusammen &#8211; den Haupt- und den Unterschl&uuml;ssel, den Namen des zu &auml;ndernden Eintrags, den neuen Wert und den Datentyp. Der Aufruf erfolgt dann wie in Listing 8.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>WertEinesEintragsAendern()\r\n     <span style=\"color:blue;\">Dim <\/span>lngHauptschluessel<span style=\"color:blue;\"> As <\/span>Key\r\n     <span style=\"color:blue;\">Dim <\/span>strSchluessel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strEintrag<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>varWert<span style=\"color:blue;\"> As Variant<\/span>\r\n     lngHauptschluessel = HKEY_CURRENT_USER\r\n     strSchluessel = \"SOFTWARE\\Microsoft\\Office\\16.0\\Access\\Settings\\Neuer Schluessel\"\r\n     strEintrag = \"Neuer Eintrag\"\r\n     varWert = \"Neuerer Wert\"\r\n     SetValue lngHauptschluessel, strSchluessel, strEintrag, varWert, dtString\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Beispiel zum &Auml;ndern des Wertes eines Eintrags in der Registry<\/span><\/b><\/p>\n<h2>Beispiel zum L&ouml;schen eines Schl&uuml;ssels aus der Registry<\/h2>\n<p>Die folgende Beispielprozedur l&ouml;scht einen Schl&uuml;ssel aus der Registry. Dazu stellt die Prozedur die beiden ben&ouml;tigten Parameter zusammen &#8211; den Hauptschl&uuml;ssel und den zu l&ouml;schenden Unterschl&uuml;ssel.<\/p>\n<p>Dieser wird dann durch den Aufruf der Wrapperfunktion <b>DeleteKey <\/b>gel&ouml;scht:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>EinenUnterschluesselLoeschen()\r\n     <span style=\"color:blue;\">Dim <\/span>lngHauptschluessel<span style=\"color:blue;\"> As <\/span>Key\r\n     <span style=\"color:blue;\">Dim <\/span>strSchluessel<span style=\"color:blue;\"> As String<\/span>\r\n     lngHauptschluessel = HKEY_CURRENT_USER\r\n     strSchluessel = \"SOFTWARE\\Microsoft\\Office\\16.0\\ Access\\Settings\\Neuer Schluessel\"\r\n     DeleteKey lngHauptschluessel, strSchluessel\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wichtig ist an dieser Stelle: Auch wenn Sie mit der Wrapperfunktion <b>CreateNewKey <\/b>gleich mehrere Schl&uuml;ssel auf einmal anlegen k&ouml;nnen, so lassen sich mit <b>DeleteKey <\/b>nicht mehrere Schl&uuml;ssel gleichzeitig l&ouml;schen. Sie k&ouml;nnen immer nur Schl&uuml;ssel aus der untersten Ebene entfernen.<\/p>\n<h2>Beispiel zum L&ouml;schen eines Eintrags aus der Registry<\/h2>\n<p>Das letzte Beispiel betrifft das L&ouml;schen eines Eintrags aus einem Schl&uuml;ssel. <\/p>\n<p>Die Prozedur stellt den Hauptschl&uuml;ssel, den Unterschl&uuml;ssel und den Eintrag zusammen und ruft dann die Wrapperfunktion <b>DeleteValue <\/b>aus dem Modul <b>mdlRegistry <\/b>auf, um den betreffenden Eintrag zu l&ouml;schen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>EinenEintragLoeschen()\r\n     <span style=\"color:blue;\">Dim <\/span>lngHauptschluessel<span style=\"color:blue;\"> As <\/span>Key\r\n     <span style=\"color:blue;\">Dim <\/span>strSchluessel<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strEintrag<span style=\"color:blue;\"> As String<\/span>\r\n     lngHauptschluessel = HKEY_CURRENT_USER\r\n     strSchluessel = \"SOFTWARE\\Microsoft\\Office\\16.0\\ Access\\Settings\\Neuer Schluessel\"\r\n     strEintrag = \"Neuer Eintrag\"\r\n     DeleteValue lngHauptschluessel, strSchluessel, _\r\n         strEintrag\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Damit haben wir alle f&uuml;r die Arbeit mit den Werten der Registry notwendigen Funktionen vorgestellt. <\/p>\n<p>Sie k&ouml;nnen damit Unterschl&uuml;ssel und Eintr&auml;ge anlegen und wieder l&ouml;schen, Werte f&uuml;r die Eintr&auml;ge festlegen und die Unterschl&uuml;ssel und Eintr&auml;ge ausgeben lassen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>RegistryPerVBA64.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/80AF7DD5-F577-4D38-9997-1186EFF2260D\/aiu_1323.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Registry von Windows ist f&uuml;r den einen oder anderen ein Buch mit sieben Siegeln. Tatsache ist: Dort landen manche wichtigen Informationen, die Sie gegebenenfalls einmal mit VBA auslesen wollen, oder Sie wollen daf&uuml;r sorgen, dass per VBA bestimmte Elemente in der Registry angelegt werden. Wir stellen einige Routinen vor, die Ihnen die Arbeit mit der Registry erleichtern. Gleichzeitig liefern wir den Code in 64-Bit-kompatibler Form.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662021,66052021,44000025],"tags":[],"class_list":["post-55001323","post","type-post","status-publish","format-standard","hentry","category-662021","category-66052021","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Registry per VBA, 32- und 64-Bit - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Registry per VBA, 32- und 64-Bit\" \/>\n<meta property=\"og:description\" content=\"Die Registry von Windows ist f&uuml;r den einen oder anderen ein Buch mit sieben Siegeln. Tatsache ist: Dort landen manche wichtigen Informationen, die Sie gegebenenfalls einmal mit VBA auslesen wollen, oder Sie wollen daf&uuml;r sorgen, dass per VBA bestimmte Elemente in der Registry angelegt werden. Wir stellen einige Routinen vor, die Ihnen die Arbeit mit der Registry erleichtern. Gleichzeitig liefern wir den Code in 64-Bit-kompatibler Form.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2024-10-22T23:00:41+00:00\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"20\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registry_per_VBA_32_und_64Bit\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registry_per_VBA_32_und_64Bit\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Registry per VBA, 32- und 64-Bit\",\"datePublished\":\"2024-10-22T23:00:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registry_per_VBA_32_und_64Bit\\\/\"},\"wordCount\":2782,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registry_per_VBA_32_und_64Bit\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0ccd8f848b2446588eb8147ead924b4e\",\"articleSection\":[\"2021\",\"5\\\/2021\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Registry_per_VBA_32_und_64Bit\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registry_per_VBA_32_und_64Bit\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registry_per_VBA_32_und_64Bit\\\/\",\"name\":\"Registry per VBA, 32- und 64-Bit - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registry_per_VBA_32_und_64Bit\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registry_per_VBA_32_und_64Bit\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0ccd8f848b2446588eb8147ead924b4e\",\"datePublished\":\"2024-10-22T23:00:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registry_per_VBA_32_und_64Bit\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Registry_per_VBA_32_und_64Bit\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registry_per_VBA_32_und_64Bit\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0ccd8f848b2446588eb8147ead924b4e\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/0ccd8f848b2446588eb8147ead924b4e\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Registry_per_VBA_32_und_64Bit\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Registry per VBA, 32- und 64-Bit\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Registry per VBA, 32- und 64-Bit - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/","og_locale":"de_DE","og_type":"article","og_title":"Registry per VBA, 32- und 64-Bit","og_description":"Die Registry von Windows ist f&uuml;r den einen oder anderen ein Buch mit sieben Siegeln. Tatsache ist: Dort landen manche wichtigen Informationen, die Sie gegebenenfalls einmal mit VBA auslesen wollen, oder Sie wollen daf&uuml;r sorgen, dass per VBA bestimmte Elemente in der Registry angelegt werden. Wir stellen einige Routinen vor, die Ihnen die Arbeit mit der Registry erleichtern. Gleichzeitig liefern wir den Code in 64-Bit-kompatibler Form.","og_url":"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/","og_site_name":"Access im Unternehmen","article_published_time":"2024-10-22T23:00:41+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Registry per VBA, 32- und 64-Bit","datePublished":"2024-10-22T23:00:41+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/"},"wordCount":2782,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/0ccd8f848b2446588eb8147ead924b4e","articleSection":["2021","5\/2021","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/","url":"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/","name":"Registry per VBA, 32- und 64-Bit - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/0ccd8f848b2446588eb8147ead924b4e","datePublished":"2024-10-22T23:00:41+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/0ccd8f848b2446588eb8147ead924b4e","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/0ccd8f848b2446588eb8147ead924b4e"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Registry_per_VBA_32_und_64Bit\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Registry per VBA, 32- und 64-Bit"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001323","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001323"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001323\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}