{"id":55001040,"date":"2016-06-01T00:00:00","date_gmt":"2020-05-22T18:59:31","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1040"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"APIPraxis_Zugriff_auf_die_Registry","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/","title":{"rendered":"API-Praxis: Zugriff auf die Registry"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/69f9840d44c943c6be097d0f1d89630e\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Windows stellt einige API-Prozeduren zum Zugriff auf die Registry zur Verf&uuml;gung. Die Registry verwaltet viele der f&uuml;r das System wichtigen Informationen. Hierzu geh&ouml;ren Informationen &uuml;ber das System, &uuml;ber die verschiedenen Anwendungen und Dateitypen und wie sie verkn&uuml;pft werden und vieles mehr. Dieser Beitrag zeigt, wie Sie per VBA &uuml;ber die Funktionen der Windows-API auf die Registry zugreifen.<\/b><\/p>\n<p>Neben den Informationen &uuml;ber das System finden Sie auch Informationen zu den Anwendungen selbst in der Registry. Wenn Sie zum Beispiel in den Optionen von Access den Standarddatenbankpfad &auml;ndern, wird der neue Pfad in die Registry eingetragen.<\/p>\n<p>Auch wenn Sie der Datenbank einen neuen Assistenten oder ein Add-In hinzuf&uuml;gen, schreibt der Add-In-Manager die ben&ouml;tigten Informationen in die Registry. F&uuml;r den Entwickler wird die Registry interessant, wenn er bestimmte Daten speichern will, die nicht in einer Tabelle untergebracht werden k&ouml;nnen oder sollen.<\/p>\n<p>Die Registry ist im Prinzip wie das Dateisystem von Windows aufgebaut. Die Verzeichnisstruktur ist nahezu identisch. Statt der Dateien enth&auml;lt die Registry Variablen. Wie die Dateien haben auch die Variablen einen bestimmten Inhalt.<\/p>\n<p>Die Windows-API stellt einige Befehle zur Bearbeitung der Registry zur Verf&uuml;gung. Im Folgenden lernen Sie Befehle, die Sie zum Hinzuf&uuml;gen, Bearbeiten und Entfernen von Schl&uuml;sseln ben&ouml;tigen, anhand eines Beispiels kennen. <\/p>\n<h2>Aufbau der Registry-Eintr&auml;ge<\/h2>\n<p>Die Eintr&auml;ge in die Registry, die Sie &uuml;ber den Befehl <b>RegEdit <\/b>&ouml;ffnen (beispielsweise &uuml;ber das Suchen-Feld von Windows 10), sind nach einem bestimmten Schema aufgebaut. Auf der obersten Ebene befinden sich die Hauptpfade. Es gibt insgesamt f&uuml;nf Hauptpfade, die Sie auch in Bild 1 sehen k&ouml;nnen:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_1040_001.png\" alt=\"Die Registry mit den f&uuml;nf Hauptzweigen\" width=\"599,4715\" height=\"324,3341\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Die Registry mit den f&uuml;nf Hauptzweigen<\/span><\/b><\/p>\n<ul>\n<li><b>HKEY_CLASSES_ROOT<\/b>: Speichert Informationen &uuml;ber die unterschiedlichen Dateitypen und die dazugeh&ouml;renden Anwendungen.<\/li>\n<li><b>HKEY_CURRENT_USER<\/b>: Speichert die Einstellungen des aktuellen Benutzers.<\/li>\n<li><b>HKEY_LOCAL_MACHINE<\/b>: Speichert Informationen &uuml;ber die Hard- und Software des Systems.<\/li>\n<li><b>HKEY_USERS<\/b>: Speichert die voreingestellten Einstellungen bez&uuml;glich Hard- und Software sowie benutzerdefinierte &auml;nderungen.<\/li>\n<li><b>HKEY_CURRENT_CONFIG<\/b>: Speichert allgemeine Informationen &uuml;ber die Systemkonfiguration.<\/li>\n<\/ul>\n<p>Jeder dieser Hauptpfade enth&auml;lt weitere, aus unterschiedlich vielen Ebenen bestehende Unterpfade. Der unterste Pfad jeder der Ebenen enth&auml;lt schlie&szlig;lich die eigentlichen Schl&uuml;ssel. Die Schl&uuml;ssel bestehen aus einem Namen und einem Wert. Mit dem Registrierungseditor, mit dem Sie die Eintr&auml;ge der Registry bequem einsehen, editieren und l&ouml;schen sowie neue Eintr&auml;ge hinzuf&uuml;gen k&ouml;nnen, greifen Sie &uuml;ber die Benutzeroberfl&auml;che auf diese Schl&uuml;ssel zu.<\/p>\n<p>Der in Bild 2 markierte Pfad lautet beispielsweise <b>HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Office\\16.0\\Access\\Menu Add-Ins\\RibbonAdmin2016<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_1040_002.png\" alt=\"Die Access-Add-Ins und ihre Registrierung in der Windows-Registry\" width=\"700\" height=\"400,8324\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die Access-Add-Ins und ihre Registrierung in der Windows-Registry<\/span><\/b><\/p>\n<p>In dem Pfad finden Sie vier Schl&uuml;ssel, die einige Informationen zu einem Access-Add-In beinhalten &#8211; unter anderem die Funktion, die beim Aufruf des Add-Ins gestartet werden soll, sowie der Ort der Bibliothek, in der die ben&ouml;tigte Funktion enthalten ist.<\/p>\n<h2>Praxisbeispiel: Shareware mit zeitlicher Begrenzung<\/h2>\n<p>Wenn Sie eine Datenbankanwendung als Shareware vertreiben, m&ouml;chten Sie die Benutzung der Anwendung m&ouml;glicherweise auf eine Testphase von beispielsweise 30 Tagen beschr&auml;nken. Die Anwendung muss also bei jedem Start zun&auml;chst &uuml;berpr&uuml;fen, ob der angegebene Zeitraum schon beendet ist oder nicht. Dazu m&uuml;ssen Sie zun&auml;chst eine Information &uuml;ber das Installationsdatum oder das Datum der ersten Anwendung speichern.<\/p>\n<p>Das Speichern der Daten innerhalb der Datenbank ist deshalb nicht zu empfehlen, weil der Anwender die Datenbank nach Ablauf der 30 Tage einfach neu installieren k&ouml;nnte. Eine weitere M&ouml;glichkeit ist das Speichern des Datums in der Registry. Wenn der Benutzer die Anwendung startet, vergleicht die Anwendung das in die Registry eingetragene Datum mit dem aktuellen Datum und soll den Benutzer gegebenenfalls auf das Ablaufen der Testphase hinweisen. Wenn der Benutzer dann die Datenbank neu installiert, findet die Datenbank den noch vorhandenen Registry-Eintrag und erkennt, dass die Testphase bereits einmal abgelaufen ist.<\/p>\n<p>Zun&auml;chst einmal &uuml;berlegt man sich, wo in der Registry ein solcher Wert am besten abgelegt wird. Da die Anwendung vermutlich unabh&auml;ngig vom Benutzer auf dem Rechner installiert, w&auml;hlt man den Hauptpfad <b>HKEY_CURRENT_USER <\/b>aus. Der Name des Pfades soll <b>\\AMVShop\\Beispiele\\Registry <\/b>lauten. Den Schl&uuml;ssel nennen Sie Installationsdatum und der Wert soll das aktuelle Datum sein.<\/p>\n<p>Selbstverst&auml;ndlich sollten Sie die Informationen etwas besser verstecken und gegebenenfalls auch verschl&uuml;sseln, wenn Sie eine Anwendung wirksam sch&uuml;tzen wollen. Da der vorliegende Anwendungsfall jedoch nur als Beispiel dienen soll, wird hier mit offenen Karten gespielt.<\/p>\n<h2>Konstanten<\/h2>\n<p>Im Rahmen der nachfolgend beschriebenen API-Funktionen definieren Sie einige Konstanten. Die Konstanten ben&ouml;tigen Sie, um innerhalb des VBA-Code statt nichtssagender Werte f&uuml;r den Entwickler verst&auml;ndliche Begriffe verwenden zu k&ouml;nnen. So definiert man beispielsweise die folgende Konstante <b>HKEY_CLASSES_ROOT<\/b>, um sie bei der Angabe eines Registryschl&uuml;ssels statt des Ausdrucks <b>&#038;H80000003 <\/b>zu verwenden:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const HKEY_CLASSES_ROOT<span style=\"color:blue;\"> As Long<\/span> = &H80000000<\/pre>\n<p>Damit Sie nicht zwischendurch immer wieder neue Kon-stanten definieren m&uuml;ssen, geben Sie direkt alle in Zusammenhang mit den Registryzugriffen ben&ouml;tigten Konstanten ein:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const HKEY_CURRENT_USER  <span style=\"color:blue;\"> As Long<\/span> = &H80000001\r\n<span style=\"color:blue;\">Public <\/span>Const HKEY_LOCAL_MACHINE <span style=\"color:blue;\"> As Long<\/span> = &H80000002\r\n<span style=\"color:blue;\">Public <\/span>Const HKEY_USERS         <span style=\"color:blue;\"> As Long<\/span> = &H80000003\r\n<span style=\"color:blue;\">Public <\/span>Const HKEY_CURRENT_CONFIG<span style=\"color:blue;\"> As Long<\/span> = &H80000005\r\n<span style=\"color:blue;\">Public <\/span>Const REG_STR            <span style=\"color:blue;\"> As Long<\/span> = 1\r\n<span style=\"color:blue;\">Public <\/span>Const REG_OPTION_NON_VOLATILE <span style=\"color:blue;\"> As Long<\/span> = 0\r\n<span style=\"color:blue;\">Public <\/span>Const REG_SZ             <span style=\"color:blue;\"> As Long<\/span> = 1\r\n<span style=\"color:blue;\">Public <\/span>Const KEY_ALL_ACCESS     <span style=\"color:blue;\"> As Long<\/span> = &H3F\r\n<span style=\"color:blue;\">Public <\/span>Const Stringl&auml;ngeMax     <span style=\"color:blue;\"> As Long<\/span> = 200\r\n<span style=\"color:blue;\">Public <\/span>Const ERROR_SUCCESS      <span style=\"color:blue;\"> As Long<\/span> = 0&\r\n<span style=\"color:blue;\">Public <\/span>Const ERROR_NO_MORE_ITEMS<span style=\"color:blue;\"> As Long<\/span> = 259&<\/pre>\n<p>Noch praktischer ist es, wenn Sie f&uuml;r die f&uuml;nf Konstanten f&uuml;r die Hauptpfade der Registry gleich eine Enumeration anlegen. Dann k&ouml;nnen Sie sp&auml;ter, wenn Sie in Funktionen eine dieser Konstanten als Parameter &uuml;bergeben wollen, ganz einfach per Intellisense auf diese Konstanten zugreifen. Dies sieht dann so aus:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Enum eRegistryPfade\r\n     HKEY_CLASSES_ROOT = &H80000000\r\n     HKEY_CURRENT_USER = &H80000001\r\n     HKEY_LOCAL_MACHINE = &H80000002\r\n     HKEY_USERS = &H80000003\r\n     HKEY_CURRENT_CONFIG = &H80000005\r\nEnd Enum<\/pre>\n<p>Sie m&uuml;ssen die entsprechenden Konstanten dann allerdings l&ouml;schen oder umbenennen, da sonst mehrere Elemente gleichen Namens im Code vorkommen, was zu Kompilierfehlern f&uuml;hrt.<\/p>\n<p>Achtung: Sie werden im Folgenden neben den Konstanten auch noch API-Funktionen deklarieren sowie VBA-Funktionen und -Prozeduren eingeben. Am besten legen Sie f&uuml;r die Konstanten und die API-Funktionen ein eigenes Modul an (zum Beispiel <b>mdlAPIRegistry<\/b>). Die VBA-Funktionen und -Prozeduren zum Thema Registry sollten Sie ebenso in einem eigenen Modul zusammenfassen &#8211; beispielsweise <b>mdlRegistry<\/b>.<\/p>\n<h2>Anlegen eines Schl&uuml;ssels<\/h2>\n<p>Die API-Funktion <b>RegCreateKeyEx <\/b>dient zum Anlegen eines Registrierungsschl&uuml;ssels. Falls der anzulegende Schl&uuml;ssel bereits vorhanden ist, &ouml;ffnet die Funktion den Schl&uuml;ssel. Die Deklaration der Funktion lautet:<\/p>\n<pre>Declare Function RegCreateKeyEx _\r\n     Lib \"advapi32.dll\" _\r\n     Alias \"RegCreateKeyExA\" (_\r\n     ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpSubKey<span style=\"color:blue;\"> As String<\/span>, _\r\n     ByVal Reserved<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpClass<span style=\"color:blue;\"> As String<\/span>, _\r\n     ByVal dwOptions<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal samDesired<span style=\"color:blue;\"> As Long<\/span>, _\r\n     lpSecurityAttributes<span style=\"color:blue;\"> As <\/span>SECURITY_ATTRIBUTES, _\r\n     phkResult<span style=\"color:blue;\"> As Long<\/span>, _\r\n     lpdwDisposition<span style=\"color:blue;\"> As Long<\/span>\r\n)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Interessant sind vor allem die Parameter <b>hKey <\/b>und <b>lpSubKey<\/b>. F&uuml;r den Parameter <b>hKey <\/b>geben Sie entweder das Handle an, das auf den entsprechenden Eintrag in der Registry zeigt, oder Sie geben einen der Hauptpfade aus der obigen Liste ein. F&uuml;r den Parameter <b>lpSubKey<\/b> geben Sie den Pfad des Registry-Wertes an, den Sie &ouml;ffnen m&ouml;chten.<\/p>\n<p>F&uuml;r den Parameter <b>lpSecurityAttributes <\/b>m&uuml;ssen Sie noch einen <b>Type <\/b>definieren, und zwar im Modul <b>mdlAPIRegistry<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>Type SECURITY_ATTRIBUTES\r\n     nLength<span style=\"color:blue;\"> As Long<\/span>\r\n     lpSecurityDescriptor<span style=\"color:blue;\"> As Long<\/span>\r\n     bInheritHandle<span style=\"color:blue;\"> As Boolean<\/span>\r\nEnd Type<\/pre>\n<p>Um den Aufruf der API-Funktion ein wenig komfortabler zu gestalten, erstellen Sie eine Funktion, an die Sie einfach nur den Hauptpfad und den Pfad des Registry-Eintrages &uuml;bergeben m&uuml;ssen:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>SchluesselErstellen(lngHauptpfad<span style=\"color:blue;\"> As Long<\/span>, _\r\n         Pfad<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n...<\/pre>\n<p>Als Hauptpfad w&uuml;rden Sie nun eine der Konstanten wie etwa <b>HKEY_LOCAL_MACHINE <\/b>eingeben. Da wir daf&uuml;r aber eine Enumeration angelegt haben, k&ouml;nnen Sie diese auch als Datentyp f&uuml;r <b>lngHauptpfad <\/b>angeben, sodass die Funktion nun wie in Listing 1 aussieht.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>SchluesselErstellen(strHauptpfad<span style=\"color:blue;\"> As <\/span>eRegistryPfade, strPfad<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngHandle<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>secAttrib<span style=\"color:blue;\"> As <\/span>SECURITY_ATTRIBUTES\r\n     RegCreateKeyEx strHauptpfad, strPfad, 0&, \"\", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, secAttrib, lngHandle, 0&\r\n     SchluesselErstellen = lngHandle\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Hilfsfunktion zum Erstellen eines Schl&uuml;ssels in der Registry<\/span><\/b><\/p>\n<p>Sie k&ouml;nnen die Funktion zum Beispiel &uuml;ber das Testfenster aufrufen.<\/p>\n<p>Geben Sie dort den folgenden Befehl ein, erhalten Sie Unterst&uuml;tzung bei der Auswahl des Hauptpfades (s. Bild 3):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_1040_003.png\" alt=\"Aufruf der Funktion SchluesselErstellen mit IntelliSense-Unterst&uuml;tzung\" width=\"499,5594\" height=\"138,2839\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Aufruf der Funktion SchluesselErstellen mit IntelliSense-Unterst&uuml;tzung<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">MsgBox<\/span> Schl&uuml;sselErstellen(HKEY_CURRENT_USER, \"SOFTWARE\\Haufe\\Beispiele\\Test\")<\/pre>\n<p>Das Meldungsfenster zeigt daraufhin die Nummer des Handles an, mit dem Sie auf den Eintrag in die Registry zugreifen k&ouml;nnen, ohne den kompletten Pfad eingeben zu m&uuml;ssen &#8211; zum Beispiel <b>4576<\/b>.<\/p>\n<p>Au&szlig;erdem erstellt die Funktion den angegebenen Pfad in der Registry, wenn er nicht bereits vorhanden ist. Wenn der Pfad bereits erstellt wurde, bereitet die Funktion den Pfad auf den Zugriff vor. Mit dem Registrierungseditor k&ouml;nnen Sie schnell &uuml;berpr&uuml;fen, ob die Funktion den Registrierungsschl&uuml;ssel wie gew&uuml;nscht angelegt hat. &ouml;ffnen Sie den Editor und navigieren Sie zu dem entsprechenden Pfad (s. Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_1040_004.png\" alt=\"Der neue Eintrag in der Windows-Registry\" width=\"549,5155\" height=\"319,8908\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Der neue Eintrag in der Windows-Registry<\/span><\/b><\/p>\n<h2>&ouml;ffnen eines Schl&uuml;ssels<\/h2>\n<p>Wenn Sie nur auf einen Schl&uuml;ssel zugreifen m&ouml;chten, verwenden Sie den API-Befehl <b>RegOpenKey<\/b>. Die Funktion hat die folgende Syntax:<\/p>\n<pre>Declare Function RegOpenKeyEx _\r\n     Lib \"advapi32.dll\" _\r\n     Alias \"RegOpenKeyExA\" ( _\r\n     ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpSubKey<span style=\"color:blue;\"> As String<\/span>, _\r\n     ByVal ulOptions<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal samDesired<span style=\"color:blue;\"> As Long<\/span>, _\r\n     phkResult<span style=\"color:blue;\"> As Long<\/span>) _\r\nAs Long<\/pre>\n<p>Auch den Aufruf dieser API-Funktion k&ouml;nnen Sie ein wenig komfortabler gestalten, indem Sie eine Funktion erstellen, die nur die wichtigsten Werte als Parameter erfordert:<\/p>\n<p>Die Funktion <b>SchluesselOeffnen <\/b>aus Listing 2 hat nur einen Unterschied im Vergleich zu der vorherigen Funktion: Sie erstellt keinen neuen Schl&uuml;ssel, falls der angegebene Schl&uuml;ssel nicht vorhanden ist. Beachten Sie, dass die API-Funktion keinen Fehler ausl&ouml;st, wenn der zu &ouml;ffnende Schl&uuml;ssel nicht vorhanden ist. Sie gibt lediglich f&uuml;r das Handle den Wert <b>0 <\/b>zur&uuml;ck.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>SchluesselOeffnen(lngHauptpfad<span style=\"color:blue;\"> As <\/span>eRegistryPfade, strPfad<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngHandle<span style=\"color:blue;\"> As Long<\/span>\r\n     RegOpenKeyEx lngHauptpfad, strPfad, 0, KEY_ALL_ACCESS, lngHandle\r\n     SchluesselOeffnen = lngHandle\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Hilfsfunktion zum Ermitteln des Handles eines Registry-Eintrags<\/span><\/b><\/p>\n<p>Ein Beispielaufruf sieht wie folgt aus:<\/p>\n<pre>  SchluesselOeffnen(HKEY_CURRENT_USER, \"SOFTWARE\\AMVShop\\Beispiele\\Test\")\r\n  3816 <\/pre>\n<h2>Entfernen eines Schl&uuml;ssels<\/h2>\n<p>Bevor Sie beginnen, den neuen Schl&uuml;ssel mit Werten zu f&uuml;llen, erfahren Sie noch, wie Sie einen Schl&uuml;ssel per API-Aufruf wieder entfernen k&ouml;nnen. Auch das ist wichtig, denn wenn Sie mit der Installation der Software in die Registry eingreifen, sollten Sie die &auml;nderung bei einer Deinstallation auch wieder r&uuml;ckg&auml;ngig machen. Zum L&ouml;schen eines Pfades in der Registry verwendet man den API-Befehl <b>RegDeleteKey<\/b>, den Sie wie folgt deklarieren:<\/p>\n<pre>Declare Function RegDeleteKey _\r\n     Lib \"advapi32.dll\" _\r\n     Alias \"RegDeleteKeyA\" ( _\r\n     ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpSubKey<span style=\"color:blue;\"> As String<\/span> _\r\n)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Die Funktion erwartet nur den Hauptpfad und den Pfad des zu l&ouml;schenden Schl&uuml;ssels. Die Funktion gibt den Wert <b>0 <\/b>zur&uuml;ck &#8211; es sei denn, die Operation schl&auml;gt fehl, zum Beispiel, weil der angegebene Pfad nicht vorhanden ist. Wichtig ist, dass Sie den kompletten zu entfernenden Pfad bis in die unterste Ebene angeben.<\/p>\n<p>Auch f&uuml;r diese API-Funktion haben wir wieder eine Wrapper-Funktion programmiert, die Sie in Listing 3 finden.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>SchluesselLoeschen(lngHauptpfad<span style=\"color:blue;\"> As <\/span>eRegistryPfade, strPfad<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngHandle<span style=\"color:blue;\"> As Long<\/span>\r\n     lngHandle = RegDeleteKey(lngHauptpfad, strPfad)\r\n     SchluesselLoeschen = lngHandle\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Hilfsfunktion zum L&ouml;schen eines Eintrags<\/span><\/b><\/p>\n<p>Wenn Sie nun den gleichen Pfad wieder l&ouml;schen wollen, den Sie soeben angelegt haben, gelingt dies nicht mit dem folgenden Aufruf der Funktion:<\/p>\n<pre>  SchluesselLoeschen(HKEY_CURRENT_USER, \"SOFTWARE\\AMVShop\\Beispiele\\Test\")\r\n0<\/pre>\n<p>Dies liefert mit dem Wert <b>0 <\/b>zwar eine Erfolgsmeldung, allerdings wird hier logischerweise nur genau das angegebene Element gel&ouml;scht, n&auml;mlich das Verzeichnis <b>Test<\/b>.<\/p>\n<p>Wenn Sie alle Verzeichnisse l&ouml;schen wollen, die Sie zuvor angelegt haben, sind noch zwei weitere Aufrufe n&ouml;tig &#8211; Sie m&uuml;ssen n&auml;mlich jedes Verzeichnis vom hintersten an einzeln l&ouml;schen:<\/p>\n<pre>  SchluesselLoeschen(HKEY_CURRENT_USER, \"SOFTWARE\\AMVShop\\Beispiele\")\r\n0\r\n SchluesselLoeschen(HKEY_CURRENT_USER, \"SOFTWARE\\AMVShop\")\r\n0<\/pre>\n<p>Wenn Sie direkt versuchen, den Pfad <b>SOFTWARE\\AMVShop <\/b>zu l&ouml;schen, l&ouml;sen Sie einen Fehler aus beziehungsweise erhalten einen anderen Wert als <b>0 <\/b>zur&uuml;ck, in diesem Fall den Wert <b>5<\/b>. Wenn Sie einen Pfad l&ouml;schen wollen, der nicht mehr vorhanden ist, liefert die Funktion den Wert <b>2<\/b>.<\/p>\n<h2>Schlie&szlig;en eines Schl&uuml;ssels<\/h2>\n<p>Mit der API-Anweisung <b>RegCloseKey<\/b> schlie&szlig;en Sie einen ge&ouml;ffneten Schl&uuml;ssel wieder und geben die dabei gebundenen Ressourcen wieder frei.<\/p>\n<p>Der einzige Parameter der Funktion ist das Handle des zu schlie&szlig;enden Schl&uuml;ssels, das Sie beim &ouml;ffnen mit <b>Reg-OpenKey <\/b>ermittelt haben. Die Deklaration lautet folgenderma&szlig;en:<\/p>\n<pre>Declare Function RegCloseKey _\r\n     Lib \"advapi32.dll\" ( _\r\n     ByVal hKey<span style=\"color:blue;\"> As Long<\/span> _\r\n)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Wenn auch eigentlich nicht n&ouml;tig, da ohnehin nur ein Parameter &uuml;bergeben wird, haben wir dennoch auch hier eine Wrapper-Funktion erstellt. Sie liefert den Wert <b>0 <\/b>zur&uuml;ck, wenn das Schlie&szlig;en gelungen ist, sonst den Wert <b>6<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>SchluesselSchliessen(lngHandle<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     SchluesselSchliessen = RegCloseKey(lngHandle)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Setzen eines Schl&uuml;sselwertes<\/h2>\n<p>Nachdem Sie nun wissen, wie Sie Registrypfade anlegen, &ouml;ffnen, schlie&szlig;en und wieder entfernen, lernen Sie jetzt, wie Sie mit der Funktion <b>RegSetValueEx <\/b>einen Schl&uuml;ssel hinzuf&uuml;gen und einen Wert daf&uuml;r angeben. Deklarieren Sie die Funktion <b>RegSetValueEx <\/b>folgenderma&szlig;en:<\/p>\n<pre>Declare Function RegSetValueEx _\r\n     Lib \"advapi32.dll\" _\r\n     Alias \"RegSetValueExA\" ( _\r\n     ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpValueName<span style=\"color:blue;\"> As String<\/span>, _\r\n     ByVal Reserved<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal dwType<span style=\"color:blue;\"> As Long<\/span>, _\r\n     lpData<span style=\"color:blue;\"> As <\/span>Any, _\r\n     ByVal cbData<span style=\"color:blue;\"> As Long<\/span> _\r\n)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Wenn Sie die Deklaration aufmerksam betrachten, dass der Parameter <b>lpData<\/b> als einziger nicht <b>ByVal<\/b>, sondern <b>ByRef <\/b>&uuml;bergeben wird und dass als Datentyp <b>Any <\/b>angegeben ist. Dahinter verbergen sich einige Besonderheiten.<\/p>\n<p>Wie bereits weiter oben erw&auml;hnt, gibt es in C im Gegensatz zu Visual Basic Parameter, die unterschiedlichen Datentyps sein k&ouml;nnen. Hier tritt dieser Fall zu Tage: Auch die Schl&uuml;sselwerte in der Registry k&ouml;nnen unterschiedlichen Datentyps sein, zum Beispiel <b>String <\/b>oder <b>Long<\/b>. Unmittelbar vor dem Parameter <b>lpData <\/b>finden Sie aber den Parameter <b>dwType<\/b>. Mit ihm k&ouml;nnen Sie der API-Funktion mitteilen, welchen Datentyps der Parameter ist. Im Falle der Registry k&ouml;nnen Sie beispielsweise Zeichenketten (<b>String<\/b>) oder Variablen des Typs <b>Long <\/b>verwenden.<\/p>\n<p>Falls Sie eine Zeichenkette verwenden, hei&szlig;t die entsprechende Konstante <b>REG_SZ<\/b>. F&uuml;r Variablen des Datentyps <b>Long <\/b>verwenden Sie die Konstante <b>REG_DWORD<\/b>. Die Konstanten dienen der besseren Handhabung f&uuml;r den menschlichen Benutzer, der mit ihnen sicher mehr anfangen kann als mit den Zahlenwerten, die sich hinter den Konstanten verbergen. Nat&uuml;rlich m&uuml;ssen Sie diese und andere Konstanten deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const REG_OPTION_NON_VOLATILE<span style=\"color:blue;\"> As Long<\/span> = 0\r\n<span style=\"color:blue;\">Public <\/span>Const REG_SZ<span style=\"color:blue;\"> As Long<\/span> = 1\r\n<span style=\"color:blue;\">Public <\/span>Const\r\n<span style=\"color:blue;\">Public <\/span>Const KEY_ALL_ACCESS<span style=\"color:blue;\"> As Long<\/span> = &H3F\r\n<span style=\"color:blue;\">Public <\/span>Const StringlaengeMax<span style=\"color:blue;\"> As Long<\/span> = 200\r\n<span style=\"color:blue;\">Public <\/span>Const ERROR_SUCCESS<span style=\"color:blue;\"> As Long<\/span> = 0&\r\n<span style=\"color:blue;\">Public <\/span>Const ERROR_NO_MORE_ITEMS<span style=\"color:blue;\"> As Long<\/span> = 259&<\/pre>\n<p>Die API-Funktion verwendet einige Parameter, die von vornherein festgelegt beziehungsweise bei der Ausf&uuml;hrung ermittelt werden. Die Funktion aus Listing 4 vereinfacht den Aufruf der Funktion <b>RegSetValueEx<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>WertSetzenString(lngHauptpfad<span style=\"color:blue;\"> As <\/span>eRegistryPfade, strPfad<span style=\"color:blue;\"> As String<\/span>, strSchluesselname<span style=\"color:blue;\"> As String<\/span>, _\r\n         strSchluesselwert<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngHandle<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngLaenge<span style=\"color:blue;\"> As Long<\/span>\r\n     lngLaenge = <span style=\"color:blue;\">Len<\/span>(strSchluesselwert)\r\n     strSchluesselwert = strSchluesselwert & Chr$(0)\r\n     lngHandle = SchluesselOeffnen(lngHauptpfad, strPfad)\r\n     WertSetzenString = RegSetValueEx(lngHandle, strSchluesselname, 0&, REG_SZ, strSchluesselwert, lngLaenge)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Hilfsfunktion zum Eintragen eines Wertes in die Registry<\/span><\/b><\/p>\n<p>Leider gelingt das Eintragen des Wertes noch nicht wie gew&uuml;nscht, denn dieser erscheint in einem falschen Zeichensatz (s. Bild 5). Dies korrigieren wir, indem wir die speziell f&uuml;r Zeichenketten geeignete API-Funktion <b>RegSetValueEx_Str <\/b>verwenden:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_1040_005.png\" alt=\"Neuer Wert mit falscher Codierung\" width=\"549,5155\" height=\"319,8908\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Neuer Wert mit falscher Codierung<\/span><\/b><\/p>\n<pre>Declare Function RegSetValueEx_Str _    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>, _\r\n     ByVal Reserved<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal dwType<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpData<span style=\"color:blue;\"> As String<\/span>, _\r\n     ByVal cbData<span style=\"color:blue;\"> As Long<\/span> _\r\n)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Den Aufruf aus der Funktion <b>WertSetzenString <\/b>passen Sie entsprechend an:<\/p>\n<pre>WertSetzenString = RegSetValueEx_Str(lngHandle,  strSchluesselname, 0&, REG_SZ, strSchluesselwert,  lngLaenge)<\/pre>\n<p>Die Funktion erwartet als Eingabeparameter den Hauptpfad, den Pfad, den Namen und den Wert des Schl&uuml;ssels. Die Funktion h&auml;ngt zun&auml;chst den Wert <b>Chr$(0) <\/b>an den Schl&uuml;sselwert an. Das ist erforderlich, damit die API-Funktion das Ende der Zeichenkette erkennen kann.<\/p>\n<p>Der anschlie&szlig;ende Aufruf der API-Funktion verwendet die Funktion <b>SchluesselOeffnen<\/b>, um aus dem Hauptpfad und dem Pfad das Handle auf den gew&uuml;nschten Schl&uuml;ssel zu ermitteln.<\/p>\n<p>Nach dieser &auml;nderung tr&auml;gt die Funktion den Wert im richtigen Zeichensatz in die Registry ein. Ein Beispielaufruf f&uuml;r das Direktfenster sieht wie folgt aus:<\/p>\n<pre>  WertSetzenString(HKEY_CURRENT_USER, \"SOFTWARE\\AMVShop\\ Beispiele\", \"Beispieltext\", \"Dies ist ein Beispieltext.\")\r\n  0 <\/pre>\n<h2>Die Registrierungsdatentypen<\/h2>\n<p>In der Regel kommen Sie mit den folgenden verschiedenen Datentypen aus:<\/p>\n<ul>\n<li><b>REG_BINARY<\/b>: bin&auml;re Daten<\/li>\n<li><b>REG_DWORD<\/b>: eine 32-bit-Zahl<\/li>\n<li><b>REG_EXPAND_SZ<\/b>: eine null-terminierte Zeichenkette, die nicht aufgel&ouml;ste Verweise wie %PATH% enthalten kann<\/li>\n<li><b>REG_MULTI_SZ<\/b>: eine Folge null-terminierter Zeichenketten, die durch den Ausdruck <b>\\n <\/b>voneinander getrennt sind<\/li>\n<li><b>REG_SZ<\/b>: eine null-terminierte Zeichenkette<\/li>\n<\/ul>\n<p>Nachfolgend finden Sie eine Liste der Deklarationen der entsprechenden Konstanten f&uuml;r die Datentypen inklusive Zahlenwerte:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const REG_SZ<span style=\"color:blue;\"> As Long<\/span> = 1\r\n<span style=\"color:blue;\">Public <\/span>Const REG_EXPAND_SZ<span style=\"color:blue;\"> As Long<\/span> = 2\r\n<span style=\"color:blue;\">Public <\/span>Const REG_BINARY<span style=\"color:blue;\"> As Long<\/span> = 3\r\n<span style=\"color:blue;\">Public <\/span>Const REG_DWORD<span style=\"color:blue;\"> As Long<\/span> = 4\r\n<span style=\"color:blue;\">Public <\/span>Const REG_MULTI_SZ<span style=\"color:blue;\"> As Long<\/span> = 5<\/pre>\n<h2>Datumsangaben eintragen<\/h2>\n<p>Wie Sie weiter oben gesehen haben, gibt es f&uuml;r das Speichern einer Zahl eine etwas andere Konstante als f&uuml;r das Speichern einer Zeichenkette. Also bauen wir uns eine weitere Wrapper-Funktion, mit der wir zuverl&auml;ssig Zahlenwerte in der Registry speichern k&ouml;nnen. Diese hei&szlig;t <b>WertSetzenLong <\/b>und sieht wie in Listing 5 aus.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>WertSetzenLong(lngHauptpfad<span style=\"color:blue;\"> As <\/span>eRegistryPfade, strPfad<span style=\"color:blue;\"> As String<\/span>, strSchluesselname<span style=\"color:blue;\"> As String<\/span>, _\r\n         lngSchluesselwert<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngHandle<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngLaenge<span style=\"color:blue;\"> As Long<\/span>\r\n     lngLaenge = <span style=\"color:blue;\">Len<\/span>(lngSchluesselwert)\r\n     lngHandle = SchluesselOeffnen(lngHauptpfad, strPfad)\r\n     WertSetzenLong = RegSetValueExA(lngHandle, strSchluesselname, 0&, REG_DWORD, lngSchluesselwert, lngLaenge)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Hilfsfunktion zum Eintragen eines Long-Wertes in die Registry<\/span><\/b><\/p>\n<p>Wenn Sie so einen Datumswert speichern wollen, m&uuml;ssen Sie nur daf&uuml;r Sorge tragen, dass dieser Datumswert im Format des Datentyps <b>Long <\/b>&uuml;bergeben wird. Beim aktuellen Datum, das Sie mit der Funktion <b>Date() <\/b>ermitteln, ist dies kein Problem:<\/p>\n<pre>WertSetzenLong HKEY_CURRENT_USER,  \"SOFTWARE\\AMVShop\\Beispiele\", \"Datum\", Date()<\/pre>\n<p><b>Date() <\/b>liefert ohnehin einen <b>Long<\/b>-Wert, der nur f&uuml;r Ausgabezwecke in das Datumsformat umgewandelt wird. Dies belegt auch ein Blick auf den neu angelegten Wert (s. Bild 6). Hier wird statt des Datums <b>8.5.2016 <\/b>der Zahlenwert <b>42498 <\/b>eingetragen (Anzahl der Tage seit dem 30.12.1899).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_1040_006.png\" alt=\"Ein weiterer neuer Eintrag in der Windows-Registry\" width=\"549,5155\" height=\"319,8908\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Ein weiterer neuer Eintrag in der Windows-Registry<\/span><\/b><\/p>\n<p>Die Funktion legt den Schl&uuml;ssel allerdings nur an, wenn der gew&uuml;nschte Pfad bereits besteht. Wenn Sie einen kompletten neuen Pfad mit Schl&uuml;sseln erstellen m&ouml;chten, m&uuml;ssen Sie eine kleine &auml;nderung in der Funktion <b>WertSetzenLong <\/b>vornehmen. Ersetzen Sie hier einfach <b>SchluesselOeffnen <\/b>durch <b>SchluesselErstellen <\/b>(dies gilt auch f&uuml;r <b>WertSetzenString<\/b>). So wird nicht nur das Handle auf den Pfad ermittelt, sondern der gew&uuml;nschte Pfad direkt erstellt &#8211; soweit er nicht bereits vorhanden ist.<\/p>\n<p>Die Funktionen erzeugen zwar sonst keinen Fehler, aber geben den Wert <b>6<\/b> zur&uuml;ck, was bedeutet, dass der Wert nicht angelegt werden konnte.<\/p>\n<h2>Abfragen eines Schl&uuml;sselwertes<\/h2>\n<p>Sie haben nun alle Informationen, um ein bestimmtes Datum in der Registry zu speichern. Wenn Sie, wie anfangs beschrieben, eine Shareware-Anwendung mit einer zeitlichen Begrenzung versehen m&ouml;chten, fehlt Ihnen nun nur noch die Abfrage des Installationsdatums. Sie k&ouml;nnen dann leicht das Installationsdatum mit dem aktuellen Datum vergleichen und die Dauer der bisherigen Nutzung ermitteln.<\/p>\n<p>Um einen Schl&uuml;sselwert aus der Registry zu ermitteln, verwenden Sie den API-Befehl <b>RegQueryValueEx<\/b>. Deklarieren Sie den Befehl wie folgt:<\/p>\n<pre>Declare Function RegQueryValueEx _\r\n     Lib \"advapi32.dll\" _\r\n     Alias \"RegQueryValueExA\" ( _\r\n     ByVal hKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpValueName<span style=\"color:blue;\"> As String<\/span>, _\r\n     ByVal lpReserved<span style=\"color:blue;\"> As Long<\/span>, _\r\n     lpType<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpData<span style=\"color:blue;\"> As <\/span>Any, _\r\n     lpcbData<span style=\"color:blue;\"> As Long<\/span> _\r\n)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Die Funktion <b>WertLesenString<\/b> aus Listing 6 vereinfacht den Aufruf der API-Funktion <b>RegQueryValueEx<\/b>. Sie erwartet als Eingabeparameter die Werte <b>lngHauptpfad<\/b>, <b>strPfad <\/b>und <b>strSchluesselname<\/b>. Die Funktion ermittelt zun&auml;chst mit der Funktion <b>SchluesselOeffnen <\/b>das Handle auf den gew&uuml;nschten Registry-Eintrag. Hat dieser nicht den Wert <b>0<\/b>, wurde der Eintrag gefunden und die Funktion f&uuml;hrt die Anweisungen innerhalb der <b>If&#8230;Then<\/b>-Bedingung aus. In diesem Fall f&uuml;llt die Funktion die Variable <b>strBuffer <\/b>mit 255 Leerzeichen und speichert die L&auml;nge der Zeichenkette in <b>lngBuffer<\/b>. Dann ruft sie die API-Funktion <b>RegQueryValueEx <\/b>auf und &uuml;bergibt neben dem Handle noch den Namen des zu ermittelnden Schl&uuml;sselwertes, die Art des Wertes (<b>REG_SZ <\/b>f&uuml;r einen String) sowie die zu f&uuml;llenden Variablen <b>strBuffer <\/b>und <b>lngBuffer<\/b>. Bei unserem Beispiel mit dem Wert <b>Dies ist ein Beispieltext. <\/b>f&uuml;r den Schl&uuml;ssel <b>Beispieltext <\/b>liefert <b>lngBuffer <\/b>den Wert <b>27<\/b>, was dem Wert unserer Zeichenkette entspricht. Damit k&ouml;nnen wir dann den relevanten Teil der zur&uuml;ckgelieferten Zeichenkette aus <b>strBuffer <\/b>mit der <b>Left<\/b>-Funktion ermitteln und zu guter Letzt den Schl&uuml;ssel mit <b>SchluesselSchliessen <\/b>wieder schlie&szlig;en.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>WertLesenString(lngHauptpfad<span style=\"color:blue;\"> As <\/span>eRegistryPfade, strPfad<span style=\"color:blue;\"> As String<\/span>, strSchluesselname<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngHandle<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBuffer<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngBuffer<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngResult<span style=\"color:blue;\"> As Long<\/span>\r\n     lngHandle = SchluesselOeffnen(HKEY_CURRENT_USER, strPfad)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngHandle = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strBuffer = Space(255)\r\n         lngBuffer = <span style=\"color:blue;\">Len<\/span>(strBuffer)\r\n         lngResult = RegQueryValueEx(lngHandle, strSchluesselname, 0&, REG_SZ, ByVal strBuffer, lngBuffer)\r\n         WertLesenString = <span style=\"color:blue;\">Left<\/span>(strBuffer, lngBuffer)\r\n         SchluesselSchliessen lngHandle\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Hilfsfunktion zum Lesen eines String-Wertes aus der Registry<\/span><\/b><\/p>\n<p>Ein Beispielaufruf f&uuml;r das Direktfenster sieht wie folgt aus:<\/p>\n<pre>  WertLesenString(HKEY_CURRENT_USER, \"SOFTWARE\\AMVShop\\ Beispiele\", \"Beispieltext\")\r\nDies ist ein Beispieltext. <\/pre>\n<h2>Zahlenwerte lesen<\/h2>\n<p>Wenn Sie einen zuvor geschriebenen Zahlenwert aus der Registry lesen m&ouml;chten, nutzen Sie die Wrapper-Funktion <b>WertLesenLong<\/b>, die Sie in Listing 7 finden. Die Funktion erwartet als Parameter den Hauptpfad, also etwa die Konstante f&uuml;r <b>HKEY_CURRENT_USER<\/b>, den Pfad sowie den Schl&uuml;sselnamen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>WertLesenLong(lngHauptpfad<span style=\"color:blue;\"> As <\/span>eRegistryPfade, strPfad<span style=\"color:blue;\"> As String<\/span>, strSchluesselname<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngHandle<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngBufferSize<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngResult<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     lngHandle = SchluesselOeffnen(HKEY_CURRENT_USER, strPfad)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngHandle = 0<span style=\"color:blue;\"> Then<\/span>\r\n         lngResult = RegQueryValueEx(lngHandle, strSchluesselname, 0&, REG_DWORD, ByVal 0, lngBufferSize)\r\n         lngResult = RegQueryValueEx(lngHandle, strSchluesselname & Chr(0), 0&, REG_DWORD, lngValue, lngBufferSize)\r\n         WertLesenLong = lngValue\r\n         SchluesselSchliessen lngHandle\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span> <\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Hilfsfunktion zum Lesen eines Long-Wertes aus der Registry<\/span><\/b><\/p>\n<p>Die Funktion ermittelt wieder mit der Funktion <b>Schluessel-Oeffnen <\/b>das Handle auf den Schl&uuml;ssel und speichert den entsprechenden Zahlenwert in der Variablen <b>lngHandle<\/b>. Wurde ein Eintrag gefunden und ist das Handle dementsprechend gr&ouml;&szlig;er als <b>0<\/b>, f&uuml;hrt die Funktion die Anweisungen in der <b>If&#8230;Then<\/b>-Bedingung aus. Diesmal folgen zwei Aufrufe der API-Funktion <b>RegQueryValueEx<\/b>.<\/p>\n<p>Der ersten vier Parameter der beiden Aufrufe sind identisch: Handle, Schl&uuml;sselname, <b>0&#038; <\/b>und die Art des Wertes (hier <b>REG_DWORD<\/b>). Die hinteren beiden unterscheiden sich jedoch: Im ersten Aufruf wollen wir zun&auml;chst die Gr&ouml;&szlig;e des Ergebnisses ermitteln und in der Variablen <b>lngBufferSize <\/b>speichern.<\/p>\n<p>Daher &uuml;bergeben wir als f&uuml;nften Parameter den Wert <b>0 <\/b>mit dem Schl&uuml;sselwort <b>ByVal <\/b>und als sechsten die zu f&uuml;llende Variable <b>lngBufferSize<\/b>. Den Wert von <b>lngBufferSize <\/b>&uuml;bergeben wir mit dem zweiten Aufruf erneut, diesmal verwenden wir als f&uuml;nften Parameter jedoch die Variable <b>lngValue<\/b>.<\/p>\n<p>Dieser Aufruf f&uuml;llt dann die Variable <b>lngValue <\/b>mit dem gew&uuml;nschten Wert, den wir dann nur noch als Funktionsergebnis an die Variable <b>WertLeseLong <\/b>&uuml;bermitteln m&uuml;ssen. Schlie&szlig;lich schlie&szlig;en wir den Schl&uuml;ssel mit der Funktion <b>SchluesselnSchliessen <\/b>wieder.<\/p>\n<h2>Schl&uuml;ssel durchlaufen<\/h2>\n<p>Gegebenenfalls m&ouml;chten Sie einmal alle Unterschl&uuml;ssel eines Schl&uuml;ssels durchlaufen.<\/p>\n<p>In diesem Fall ben&ouml;tigen Sie die API-Funktion <b>RegEnumKeyEx<\/b>, die wie folgt deklariert wird:<\/p>\n<pre>Declare Function RegEnumKeyEx Lib \"advapi32.dll\" _\r\n     Alias \"RegEnumKeyExA\" ( _\r\n     ByVal HKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal dwIndex<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpName<span style=\"color:blue;\"> As String<\/span>, _\r\n     lpcbName<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpReserved<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpClass<span style=\"color:blue;\"> As String<\/span>, _\r\n     lpcbClass<span style=\"color:blue;\"> As Long<\/span>, _\r\n     lpftLastWriteTime<span style=\"color:blue;\"> As <\/span>FILETIME _\r\n)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Diese verwendet einen weiteren Typ namens <b>FILETIME<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Type FILETIME\r\n   dwLowDateTime<span style=\"color:blue;\"> As Long<\/span>\r\n   dwHighDateTime<span style=\"color:blue;\"> As Long<\/span>\r\nEnd Type<\/pre>\n<p>Die Funktion <b>SchluesselDurchlaufen <\/b>erwartet wiederum den Hauptpfad, also beispielsweise die Konstante <b>HKEY_CURRENT_USER <\/b>und den Pfad zum zu durchsuchenden Schl&uuml;ssel als Parameter (s. Listing 8).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>SchluesselDurchlaufen(lngHauptpfad<span style=\"color:blue;\"> As <\/span>eRegistryPfade, strPfad<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngSubkey<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngEnum<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngKey<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngResult<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBuffer1<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngBuffer1<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBuffer2<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngBuffer2<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>typFiletime<span style=\"color:blue;\"> As <\/span>FILETIME\r\n     lngResult = RegOpenKeyEx(lngHauptpfad, strPfad, 0&, KEY_ALL_ACCESS, lngSubkey)\r\n     <span style=\"color:blue;\">If <\/span>lngResult = 0<span style=\"color:blue;\"> Then<\/span>\r\n         Do\r\n             strBuffer1 = Space$(255)\r\n             lngBuffer1 = <span style=\"color:blue;\">Len<\/span>(strBuffer1)\r\n             strBuffer2 = Space$(255)\r\n             lngBuffer2 = <span style=\"color:blue;\">Len<\/span>(strBuffer2)\r\n             lngResult = RegEnumKeyEx(lngSubkey, lngEnum, strBuffer1, lngBuffer1, 0&, strBuffer2, lngBuffer2, _\r\n                 typFiletime)\r\n             <span style=\"color:blue;\">If <\/span>lngResult = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">Debug.Print<\/span> <span style=\"color:blue;\">Left<\/span>(strBuffer1, lngBuffer1)\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             lngEnum = lngEnum + 1\r\n         <span style=\"color:blue;\">Loop<\/span> Until <span style=\"color:blue;\">Not<\/span> lngResult = 0\r\n         SchluesselSchliessen lngSubkey\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span> <\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Funktion zum Durchlaufen der Schl&uuml;ssel unterhalb des angegebenen Schl&uuml;ssels<\/span><\/b><\/p>\n<p>Die Funktion pr&uuml;ft zun&auml;chst mit der API-Funktion <b>Reg-OpenKeyEx<\/b>, ob der Schl&uuml;ssel vorhanden ist, was den Wert <b>0 <\/b>f&uuml;r die Variable <b>lngResult <\/b>schreibt. Gleichzeitig ben&ouml;tigen wir von dieser Funktion den Parameter <b>lngSubkey<\/b>, welcher das Handle auf diesen Schl&uuml;ssel liefert.<\/p>\n<p>Wenn <b>lngResult <\/b>den Wert <b>0 <\/b>liefert, ist der Schl&uuml;ssel vorhanden und wir k&ouml;nnen diesen nach untergeordneten Schl&uuml;sseln durchsuchen. Dazu verwenden wir eine <b>Do&#8230;Loop Until<\/b>-Schleife. Innerhalb der Schleife f&uuml;llen wir die Variablen <b>strBuffer1 <\/b>und <b>strBuffer2 <\/b>mit jeweils 255 Leerzeichen und die Variablen <b>lngBuffer1 <\/b>und <b>lngBuffer2 <\/b>mit der Anzahl der in den Stringvariablen gespeicherten Zeichen. Dann rufen wir die API-Funktion <b>RegEnumKeyEx<\/b> auf und &uuml;bergeben ihr die folgenden Parameter:<\/p>\n<ul>\n<li><b>lngSubkey<\/b>: Handle des zu durchsuchenden Schl&uuml;ssels<\/li>\n<li><b>lngEnum<\/b>: aktuelle Nummer des zu ermittelnden Unterschl&uuml;ssels, beim ersten Durchlauf <b>0<\/b><\/li>\n<li><b>strBuffer1<\/b>: Soll den Namen des Unterschl&uuml;ssels aufnehmen.<\/li>\n<li><b>lngBuffer1<\/b>: Soll die L&auml;nge des Unterschl&uuml;ssels aufnehmen.<\/li>\n<li><b>strBuffer2<\/b>: Ohne Funktion.<\/li>\n<li><b>lngBuffer2<\/b>: Ohne Funktion.<\/li>\n<li><b>typFILETIME<\/b>: Ohne Funktion.<\/li>\n<\/ul>\n<p>Wenn <b>lngResult <\/b>den Wert <b>0 <\/b>enth&auml;lt, wurde ein Unterschl&uuml;ssel gefunden, anderenfalls nicht. Im Falle eines Fundes gibt die Funktion den Namen des Unterschl&uuml;ssels im Direktfenster aus. Dabei ermittelt sie den relevanten Inhalt der Variablen <b>strBuffer1<\/b>, die nach wie vor 255 Zeichen lang ist, &uuml;ber die <b>Left<\/b>-Funktion. Diese erwartet als zweiten Parameter die Variable <b>lngBuffer1<\/b>, welche die relevante L&auml;nge enth&auml;lt.<\/p>\n<p>Dann erh&ouml;ht die Funktion den Wert der Variablen <b>lngEnum <\/b>um <b>1<\/b>, damit beim n&auml;chsten Schleifendurchlauf das n&auml;chste Element ermittelt werden kann. Die Schleife wird beendet, wenn <b>lngResult <\/b>nicht den Wert <b>0 <\/b>enth&auml;lt. Dies ist der Fall, wenn <b>RegEnumKeyEx <\/b>kein Ergebnis mehr liefert.<\/p>\n<p>Ein Aufruf sieht beispielsweise wie folgt aus &#8211; inklusive gek&uuml;rztem Ergebnis:<\/p>\n<pre>Schluesseldurchlaufen HKEY_CURRENT_USER, \"SOFTWARE\"\r\nAdobe\r\nAMVShop\r\n...\r\nWinRAR\r\nWow6432Node\r\nClasses<\/pre>\n<h2>Werte eines Schl&uuml;ssels durchlaufen<\/h2>\n<p>Ein &auml;hnliches Spiel k&ouml;nnen wir auch noch mit den Werten eines Schl&uuml;ssels durchf&uuml;hren. Die dazu ben&ouml;tigte API-Funktion hei&szlig;t <b>RegEnumValue <\/b>und wird wie folgt deklariert:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>Declare Function RegEnumValue _\r\n     Lib \"advapi32.dll\" Alias \"RegEnumValueA\" ( _\r\n     ByVal HKey<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal dwIndex<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpValueName<span style=\"color:blue;\"> As String<\/span>, _\r\n     lpcbValueName<span style=\"color:blue;\"> As Long<\/span>, _\r\n     ByVal lpReserved<span style=\"color:blue;\"> As Long<\/span>, _\r\n     lpType<span style=\"color:blue;\"> As Long<\/span>, _\r\n     lpData<span style=\"color:blue;\"> As Byte<\/span>, _\r\n     lpcbData<span style=\"color:blue;\"> As Long<\/span> _\r\n)<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Die Wrapper-Funktion namens <b>WerteDurchlaufen <\/b>finden Sie in Listing 9. Sie erwartet die folgenden Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>WerteDurchlaufen(lngHauptpfad<span style=\"color:blue;\"> As <\/span>eRegistryPfade, strPfad<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>lngSubkey<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngEnum<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngResult<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBuffer<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngBuffer<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngType<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bytData(1 To 2048)<span style=\"color:blue;\"> As Byte<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngData<span style=\"color:blue;\"> As Long<\/span>\r\n     lngResult = RegOpenKeyEx(lngHauptpfad, strPfad, 0&, KEY_ALL_ACCESS, lngSubkey)\r\n     <span style=\"color:blue;\">If <\/span>lngResult = 0<span style=\"color:blue;\"> Then<\/span>\r\n         Do\r\n             strBuffer = Space$(255)\r\n             lngBuffer = <span style=\"color:blue;\">Len<\/span>(strBuffer1)\r\n             Erase bytData\r\n             lngData = <span style=\"color:blue;\">UBound<\/span>(bytData)\r\n             lngResult = RegEnumValue(lngSubkey, lngEnum, strBuffer, lngBuffer, 0&, lngType, bytData(1), lngData)\r\n             <span style=\"color:blue;\">If <\/span>lngResult = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">Debug.Print<\/span> lngType, <span style=\"color:blue;\">Left<\/span>(strBuffer, lngBuffer)\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             lngEnum = lngEnum + 1\r\n         <span style=\"color:blue;\">Loop<\/span> Until <span style=\"color:blue;\">Not<\/span> lngResult = 0\r\n         SchluesselSchliessen lngSubkey\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span> <\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Funktion zum Durchlaufen der Werte unterhalb des angegebenen Schl&uuml;ssels<\/span><\/b><\/p>\n<ul>\n<li><b>lngHauptpfad<\/b>: Konstante f&uuml;r den Hauptpfad des Schl&uuml;ssels, also beispielsweise <b>HKEY_CURRENT_USER<\/b><\/li>\n<li><b>strPfad<\/b>: Unterpfad, also etwa <b>SOFTWARE\\AMVShop\\Beispiele<\/b><\/li>\n<\/ul>\n<p>Sie pr&uuml;ft zun&auml;chst wieder mit der Funktion <b>RegOpenKeyEx<\/b>, ob der angegebene Schl&uuml;ssel &uuml;berhaupt existiert. In diesem Fall erh&auml;lt <b>lngResult <\/b>den Wert <b>0 <\/b>und der letzte Parameter des Aufrufs namens <b>lngSubkey <\/b>wird mit dem Handle auf diesen Schl&uuml;ssel gef&uuml;llt.<\/p>\n<p>In diesem Fall startet die Funktion wieder eine <b>Do&#8230;Loop Until<\/b>-Schleife. Innerhalb der Schleife f&uuml;llt sie die Variable <b>strBuffer<\/b> mit 255 Leerzeichen und die Variable <b>lngBuffer <\/b>mit der L&auml;nge der soeben gef&uuml;llten Zeichenkette.<\/p>\n<p>Die n&auml;chste wichtige Anweisung ruft die API-Funktion <b>Reg-EnumValue <\/b>auf und &uuml;bergibt ihr die zusammengestellten Parameter. Das Ergebnis findet sich in den f&uuml;r uns interessanten Parametern <b>strBuffer<\/b>, <b>lngBuffer <\/b>und <b>lngType<\/b>. lngType enth&auml;lt den Typ des Wertes, also zum Beispiel <b>1 <\/b>f&uuml;r einen String oder <b>4 <\/b>f&uuml;r einen <b>DWORD<\/b>-Wert (also eine Zahl).<\/p>\n<p>Am wichtigsten aber ist der Wert von <b>lngResult<\/b>, denn wenn dieser nicht <b>0 <\/b>ist, wurde mit diesem Aufruf kein Wert gefunden &#8211; in diesem Fall endet die Schleife. Anderenfalls gibt die Schleife den Wert der Variablen <b>lngType<\/b>, also den Typ des Wertes, und den Namen des Wertes aus, der wieder mithilfe der <b>Left<\/b>-Funktion mit den beiden Werten aus <b>strBuffer <\/b>und <b>lngBuffer <\/b>ermittelt wird. Nachdem alle Werte ermittelt wurden, schlie&szlig;t die Funktion mit einem Aufruf der Wrapper-Funktion <b>SchluesselSchliessen <\/b>den Schl&uuml;ssel wieder. Ein Beispiel f&uuml;r unsere weiter oben hinzugef&uuml;gten Beispielwerte sieht wie folgt aus:<\/p>\n<pre>WerteDurchlaufen HKEY_CURRENT_USER,  \"SOFTWARE\\AMVShop\\Beispiele\"\r\n  4            Datum\r\n  1            Beispieltext<\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit den hier vorgestellten API-Funktionen und den daf&uuml;r vorbereiteten Wrapper-Funktionen k&ouml;nnen Sie die wichtigsten Operationen rund um die Registry ausf&uuml;hren.<\/p>\n<p>Interessant w&auml;re es beispielsweise noch, bestimmte Schl&uuml;ssel samt ihrer Werte rekursiv zu durchlaufen, um diese beispielsweise in die Datenbank zu schreiben und sie gegebenenfalls besser durchsuchbar zu machen. Die Windows-Registry hat ja den Nachteil, dass Sie die Werte immer nur Schritt f&uuml;r Schritt durchsuchen k&ouml;nnen, was mitunter etwas m&uuml;hselig ist, wenn Sie nur ein bestimmtes Auftauchen eines Schl&uuml;ssels suchen. Wenn Sie die Schl&uuml;ssel hin und wieder in die Tabellen einer Datenbank exportieren, k&ouml;nnten Sie sich alle Fundstellen auf einen Blick ausgeben lassen.<\/p>\n<p>Gegebenenfalls schauen wir uns eine solche L&ouml;sung in einem Beitrag in einer der folgenden Ausgaben einmal an.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>APIPraxis.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{D3238BEB-BCC2-4BEF-9CF2-755B3AA156CA}\/aiu_1040.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Windows stellt einige API-Prozeduren zum Zugriff auf die Registry zur Verf&uuml;gung. Die Registry verwaltet viele der f&uuml;r das System wichtigen Informationen. Hierzu geh&ouml;ren Informationen &uuml;ber das System, &uuml;ber die verschiedenen Anwendungen und Dateitypen und wie sie verkn&uuml;pft werden und vieles mehr. Dieser Beitrag zeigt, wie Sie per VBA &uuml;ber die Funktionen der Windows-API auf die Registry zugreifen.<\/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":[662016,66032016,44000025],"tags":[],"class_list":["post-55001040","post","type-post","status-publish","format-standard","hentry","category-662016","category-66032016","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>API-Praxis: Zugriff auf die Registry - 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\/APIPraxis_Zugriff_auf_die_Registry\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"API-Praxis: Zugriff auf die Registry\" \/>\n<meta property=\"og:description\" content=\"Windows stellt einige API-Prozeduren zum Zugriff auf die Registry zur Verf&uuml;gung. Die Registry verwaltet viele der f&uuml;r das System wichtigen Informationen. Hierzu geh&ouml;ren Informationen &uuml;ber das System, &uuml;ber die verschiedenen Anwendungen und Dateitypen und wie sie verkn&uuml;pft werden und vieles mehr. Dieser Beitrag zeigt, wie Sie per VBA &uuml;ber die Funktionen der Windows-API auf die Registry zugreifen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T18:59:31+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/69f9840d44c943c6be097d0f1d89630e\" \/>\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=\"26\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/APIPraxis_Zugriff_auf_die_Registry\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/APIPraxis_Zugriff_auf_die_Registry\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"API-Praxis: Zugriff auf die Registry\",\"datePublished\":\"2020-05-22T18:59:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/APIPraxis_Zugriff_auf_die_Registry\\\/\"},\"wordCount\":4143,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/APIPraxis_Zugriff_auf_die_Registry\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/69f9840d44c943c6be097d0f1d89630e\",\"articleSection\":[\"2016\",\"3\\\/2016\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/APIPraxis_Zugriff_auf_die_Registry\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/APIPraxis_Zugriff_auf_die_Registry\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/APIPraxis_Zugriff_auf_die_Registry\\\/\",\"name\":\"API-Praxis: Zugriff auf die Registry - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/APIPraxis_Zugriff_auf_die_Registry\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/APIPraxis_Zugriff_auf_die_Registry\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/69f9840d44c943c6be097d0f1d89630e\",\"datePublished\":\"2020-05-22T18:59:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/APIPraxis_Zugriff_auf_die_Registry\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/APIPraxis_Zugriff_auf_die_Registry\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/APIPraxis_Zugriff_auf_die_Registry\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/69f9840d44c943c6be097d0f1d89630e\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/69f9840d44c943c6be097d0f1d89630e\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/APIPraxis_Zugriff_auf_die_Registry\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API-Praxis: Zugriff auf die Registry\"}]},{\"@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":"API-Praxis: Zugriff auf die Registry - 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\/APIPraxis_Zugriff_auf_die_Registry\/","og_locale":"de_DE","og_type":"article","og_title":"API-Praxis: Zugriff auf die Registry","og_description":"Windows stellt einige API-Prozeduren zum Zugriff auf die Registry zur Verf&uuml;gung. Die Registry verwaltet viele der f&uuml;r das System wichtigen Informationen. Hierzu geh&ouml;ren Informationen &uuml;ber das System, &uuml;ber die verschiedenen Anwendungen und Dateitypen und wie sie verkn&uuml;pft werden und vieles mehr. Dieser Beitrag zeigt, wie Sie per VBA &uuml;ber die Funktionen der Windows-API auf die Registry zugreifen.","og_url":"https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T18:59:31+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/69f9840d44c943c6be097d0f1d89630e","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"26\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"API-Praxis: Zugriff auf die Registry","datePublished":"2020-05-22T18:59:31+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/"},"wordCount":4143,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/69f9840d44c943c6be097d0f1d89630e","articleSection":["2016","3\/2016","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/","url":"https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/","name":"API-Praxis: Zugriff auf die Registry - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/69f9840d44c943c6be097d0f1d89630e","datePublished":"2020-05-22T18:59:31+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/69f9840d44c943c6be097d0f1d89630e","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/69f9840d44c943c6be097d0f1d89630e"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/APIPraxis_Zugriff_auf_die_Registry\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"API-Praxis: Zugriff auf die Registry"}]},{"@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\/55001040","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=55001040"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001040\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001040"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001040"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001040"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}