{"id":55001123,"date":"2018-04-01T00:00:00","date_gmt":"2020-05-13T21:18:48","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1123"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Dateieigenschaften_ermitteln","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/","title":{"rendered":"Dateieigenschaften ermitteln"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/e5e0fec6fb914795a4cc1090b5049d19\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>In Access-Datenbanken werden ja nicht immer nur Personen, Objekte und Vorg&auml;nge verwaltet. Nicht selten lesen Sie auch Dateien und deren Eigenschaften in Tabellen ein. Denken Sie etwa an die Informationen, die Sie Audio- oder Videodateien f&uuml;r eine Medienverwaltung abringen m&ouml;chten. Mit dem R&uuml;stzeug von VBA allein kommen Sie hier nicht weit, wohl aber mit den Shell-Objekten von Windows.<\/b><\/p>\n<h2>Dateieigenschaften im Explorer<\/h2>\n<p>Der <b>Explorer<\/b> von Windows zeigt einige Eigenschaften von Dateien in voreingestellten Spalten an, wenn Sie die Detailansicht ausw&auml;hlen. Welche das sind, h&auml;ngt vom Ordnerinhalt ab, den Windows vermutet. F&uuml;r allgemeine Dateien sind das neben dem Namen in der Regel noch der <b>Dateityp<\/b>, die <b>Gr&ouml;&szlig;e<\/b>, sowie <b>&auml;nderungs<\/b>&#8211; und <b>Erstelldatum<\/b>. Befinden sich jedoch etwa eine gr&ouml;&szlig;ere Anzahl von <b>JPEG<\/b>-Dateien im Verzeichnis, so wechselt der Explorer das Spalten-Set in mehr oder weniger f&uuml;r Bilder n&uuml;tzliche Informationen. <\/p>\n<p>Mit Rechtsklick auf die Spaltenk&ouml;pfe erscheint ein Popup-Men&uuml;, &uuml;ber das Sie andere gebr&auml;uchliche Spalten an- oder abw&auml;hlen k&ouml;nnen (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/ExplorerPopup.png\" alt=\"Popup des Explorer-Spaltenkopfs\" width=\"225\" height=\"258,0163\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Popup des Explorer-Spaltenkopfs<\/span><\/b><\/p>\n<p>Ben&ouml;tigen Sie andere Informationen, so erscheint &uuml;ber <b>Weitere&#8230;<\/b> der Dialog in Bild 2, in dem Sie aus einer umfangreichen Liste die gew&uuml;nschten Eintr&auml;ge markieren, wobei viele nur bestimmten Dateitypen vorbehalten sind, weshalb die dann eingeblendeten Spalten im Zweifel leer bleiben. Das eingestellte Spalten-Set speichert die <b>Windows-Shell<\/b> pro Ordner persistent, sobald Sie ihn verlassen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/ExlorerDlg.png\" alt=\"Liste der Dateieigenschaften im Details-Dialog des Explorer f&uuml;r Ordner\" width=\"425\" height=\"545,7245\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Liste der Dateieigenschaften im Details-Dialog des Explorer f&uuml;r Ordner<\/span><\/b><\/p>\n<p>Klicken Sie auf eine Datei rechts und w&auml;hlen im Kontextmen&uuml; den Eintrag <b>Eigenschaften<\/b>, so bekommen Sie unter dem Reiter <b>Details<\/b> allerlei Informationen pr&auml;sentiert, die sich je nach Dateityp in Inhalt und Umfang unterscheiden (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/ExplorerProps.png\" alt=\"Informationen zu einer MP3-Datei im Eigenschaftendialog des Explorers\" width=\"425\" height=\"581,335\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Informationen zu einer MP3-Datei im Eigenschaftendialog des Explorers<\/span><\/b><\/p>\n<p>Der Name einer Eigenschaft ist dabei jeweils identisch zu jenem, der auch im anderen Dialog oder in den Spaltenk&ouml;pfen angezeigt wird. Das Gleiche gilt f&uuml;r die Werte. Einige Eigenschaften sind hier sogar editierbar, wenn sich das Wertefeld beim Markieren in eine Textbox verwandelt.<\/p>\n<p>Wir haben es hier &uuml;berall mit dem sogenannten <b>Property System<\/b> von Windows zu tun, das in die <b>Shell<\/b> integriert ist. Und auf dieses k&ouml;nnen Sie mithilfe einiger Objekte auch in Ihrem VBA-Projekt zugreifen! Der Aufwand daf&uuml;r h&auml;lt sich in Grenzen. Es werden im Prinzip n&auml;mlich keine jener <b>API<\/b>-Funktionen ben&ouml;tigt, die man sonst h&auml;ufig in entsprechenden Routinen zum Auslesen von Dateieigenschaften im Netz findet.<\/p>\n<h2>Das Windows Property System<\/h2>\n<p>Es wurde in der jetzigen Form mit <b>Windows Vista<\/b> eingef&uuml;hrt und dient der Abstraktion von Dateieigenschaften im System. &uuml;ber die Ansprache einer einzigen Komponente (<b>propsys.dll<\/b>) k&ouml;nnen alle verf&uuml;gbaren Informationen abgerufen werden. Diese Komponente bem&uuml;ht ihrerseits andere Komponenten, die die eigentliche Arbeit verrichten, weil nur sie den Aufbau bestimmter Dateitypen kennen. Und au&szlig;erdem kann das <b>Property System<\/b> noch durch installierte Programme erweitert werden. <b>Office<\/b> installiert etwa zus&auml;tzliche solcher <b>Property Handler<\/b>, damit Sie direkt auf Dokumenteigenschaften zugreifen k&ouml;nnen, ohne eines der Programme starten zu m&uuml;ssen. Daf&uuml;r gibt es eine festgelegte Schnittstelle. Welche Dateitypen mit welchen Komponenten korrelieren, wird dabei in der <b>Registry<\/b> festgehalten.<\/p>\n<h2>Datenbank f&uuml;r Dateieigenschaften<\/h2>\n<p>Die Demo zu diesem Beitrag (F<b>ileProps.accdb<\/b>) enth&auml;lt alles N&ouml;tige f&uuml;r den Umgang mit diesen Dateieigenschaften. Sie k&ouml;nnen Teile aus ihr problemlos in eigene Projekte &uuml;bertragen.<\/p>\n<p>Grundvoraussetzung ist zun&auml;chst ein <b>Verweis<\/b> auf die Bibliothek <b>Microsoft Shell Controls And Automation<\/b> im VBA-Projekt, die sich dann im Objektkatalog als <b>Shell32<\/b> zeigt. Die Bibliothek bringt Windows immer mit und kann deshalb ganz ohne Gewissensbisse eingesetzt werden.<\/p>\n<p>Die Prozedur <b>SHGetPropertyString<\/b> im Modul <b>mdlPropsShell<\/b> macht sich dann einige Klassenobjekte der Bibliothek zunutze. Mit gerade einmal 20 Zeilen Code erledigt sie das Auslesen beliebiger Datei- und Ordnereigenschaften, die von der Shell unterst&uuml;tzt werden &#8211; und das sind eine ganze Menge! Listing 1 zeigt die komplette Routine. Sie &uuml;bergeben der Funktion im ersten Parameter den vollen Pfad der Datei und im zweiten die gew&uuml;nschte Eigenschaft. Zur&uuml;ck erhalten Sie dann grunds&auml;tzlich den Wert der Eigenschaft als String. Dies w&auml;re ein Beispiel:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>oSH<span style=\"color:blue;\"> As <\/span>Shell32.Shell\r\n<span style=\"color:blue;\">Function <\/span>SHGetPropertyString(sFile<span style=\"color:blue;\"> As String<\/span>, sProp<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>sFld<span style=\"color:blue;\"> As String<\/span>, sFil<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>oFld<span style=\"color:blue;\"> As <\/span>Shell32.Folder3\r\n     <span style=\"color:blue;\">Dim <\/span>oItm<span style=\"color:blue;\"> As <\/span>Shell32.ShellFolderItem\r\n     <span style=\"color:blue;\">Dim <\/span>vRet<span style=\"color:blue;\"> As Variant<\/span>\r\n     \r\n     <span style=\"color:blue;\">If <\/span>oSH Is Nothing<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Set<\/span> oSH = <span style=\"color:blue;\">New<\/span> Shell32.Shell\r\n         \r\n     sFld = <span style=\"color:blue;\">Left<\/span>(sFile, <span style=\"color:blue;\">InStrRev<\/span>(sFile, \"\\\") - 1)\r\n     sFil = <span style=\"color:blue;\">Mid<\/span>(sFile, <span style=\"color:blue;\">InStrRev<\/span>(sFile, \"\\\") + 1)\r\n     <span style=\"color:blue;\">Set<\/span> oFld = oSH.NameSpace(CStr(sFld))\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(sFil) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> oItm = oFld.Self\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> oItm = oFld.Items.Item(CStr(sFil))\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     vRet = oItm.ExtendedProperty(sProp)\r\n     <span style=\"color:blue;\">If <\/span>IsArray(vRet)<span style=\"color:blue;\"> Then<\/span>\r\n         SHGetPropertyString = Join(vRet, \";\")\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         SHGetPropertyString = vRet\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 1: Die Funktion gibt eine beliebige Dateieigenschaft zur&uuml;ck<\/span><\/b><\/p>\n<pre>  SHGetPropertyString(\"d:\\mp3s\\fullalbum.mp3\", \"System.Size\")\r\n-&gt; \"62356466\"<\/pre>\n<p>Hier wird die Dateigr&ouml;&szlig;e der MP3-Datei ermittelt. Setzen Sie als zweiten Parameter <b>System.DateCreated<\/b> ein, so erhielten Sie das Erstelldatum:<\/p>\n<pre>-&gt; \"02.11.2017 16:23:48\"<\/pre>\n<p>Oder mit <b>System.FileOwner<\/b> den Besitzer der Datei:<\/p>\n<pre>-&gt; \"MeinComputername\\Herbert\"<\/pre>\n<p>Was es mit diesen <b>Property<\/b>-Parametern auf sich hat und wie man auf sie kommt, erl&auml;utern wir sp&auml;ter noch. Hier folgt aber zun&auml;chst die Funktionsweise des Codes.<\/p>\n<p>Das zentrale Objekt, von dem sich alles Weitere ableitet, steht in der Objektvariablen <b>oSH<\/b> vom Typ <b>Shell<\/b>, die im Modulkopf global deklariert ist. Dieses Objekt kann per <b>New<\/b> erzeugt werden. Eine Alternative, die ganz ohne Bibliotheksverweis auskommt, w&auml;re<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> oSH = CreateObject(\"Shell.Application\")<\/pre>\n<p>Bevor das Objekt benutzt wird, m&uuml;ssen aber aus dem vollen Pfad in <b>sFile<\/b> erst der Ordner- und der Dateinamenanteil extrahiert werden, was die folgenden zwei Zeilen erledigen. <b>sFld<\/b> enth&auml;lt danach den Ordner, <b>sFil<\/b> den Dateinamen. Um beim vorigen Beispiel zu bleiben:<\/p>\n<pre>sFld -&gt; \"d:\\mp3s\"\r\nsFil -&gt; \"fullalbum.mp3\"<\/pre>\n<p>Die <b>NameSpace<\/b>-Funktion des <b>Shell<\/b>-Objekts gibt nun ein neues Objekt vom Typ <b>Folder<\/b> in <b>oFld<\/b> zur&uuml;ck, wenn man den Pfad &uuml;bergibt, der hier zus&auml;tzlich mit <b>CStr<\/b> behandelt wird. Manchmal funktioniert die &uuml;bergabe eines VBA-Strings hier n&auml;mlich nicht korrekt und <b>CStr<\/b> stellt sicher, dass die Funktion einen g&uuml;ltigen COM-String erh&auml;lt.<\/p>\n<p>Der Clou an der Routine ist, dass Sie ihr nicht nur Dateien, sondern auch Ordner zur Inspektion verabreichen k&ouml;nnen. In diesem Fall ist die Variable <b>sFil<\/b> dann leer und die per <b>Len()<\/b> ermittelte L&auml;nge <b>0<\/b>. Davon h&auml;ngt in der Bedingung ab, wie weiter verfahren wird. Denn als n&auml;chstes wird die <b>Items<\/b>-Auflistung des Folder-Objekts bem&uuml;ht. Das ist im Prinzip das, was der Explorer auf der rechten Seite ausgibt. Ein <b>Item<\/b> kann eine Datei im Verzeichnis sein, oder ein Unterordner. Da der Explorer auch virtuelle Objekte darstellen kann, wie etwa die Systemsteuerung, k&ouml;nnte ein <b>Item<\/b> auch ein virtuelles Objekt wiederspiegeln. Selbst dessen Eigenschaften k&ouml;nnten mit der Routine ausgelesen werden, doch das steht hier im Beitrag gerade nicht zur Debatte.<\/p>\n<p>Das <b>Item<\/b> erh&auml;lt die Objektvariable <b>oItm<\/b> vom Typ <b>ShellFolderItem<\/b>. F&uuml;r eine Datei &uuml;bergeben Sie als Index der Auflistung <b>Items<\/b> den Namen in <b>sFil<\/b>. Soll der Ordner selbst inspiziert werden, so kann er selbst in ein <b>Item<\/b> &uuml;berf&uuml;hrt werden, wenn die Methode <b>Self<\/b> auf den <b>Folder<\/b> angewandt wird. Und nun sind wir soweit: Vom <b>Item<\/b> kann die Funktion <b>ExtendedProperty<\/b> abgerufen werden, der als Parameter der Systemname der Eigenschaft (<b>sProp<\/b>) &uuml;bergeben wird. Das Ergebnis steht nun im Variant <b>vRet<\/b>.<\/p>\n<p>Allerdings gibt diese Methode nicht immer nur einen String zur&uuml;ck, sondern manchmal auch ein ein <b>String-Array<\/b>. Ein Word-Dokument kann etwa mehrere Autoren aufweisen, die &uuml;ber den <b>Property<\/b>-Namen <b>System.Author <\/b>ermittelt w&uuml;rden. Die einzelnen Autoren st&uuml;nden dann als Elemente eines Arrays im Ergebnis. Die VBA-Funktion <b>IsArray<\/b> erkennt, ob das Ergebnis ein Array ist. Dann f&uuml;gt die <b>Join<\/b>-Funktion die Elemente des Arrays zu einem einzelnen String zusammen.<\/p>\n<h2>System Property Names<\/h2>\n<p>Was Sie nun noch brauchen, um s&auml;mtliche Eigenschaften einer Datei auslesen zu k&ouml;nnen, sind die Systemnamen der Eigenschaften. Leider gibt es daf&uuml;r keine generelle Liste. Denn erstens hat jede Windows-Version ihre eigenen abweichenden Systemeigenschaften, und zweitens l&auml;sst sich, wie erw&auml;hnt, das <b>Property System<\/b> ja durch neu installierte Programme erweitern, was zu neuen in der Registry eingetragenen <b>Property Names<\/b> f&uuml;hrt.<\/p>\n<p>Leider ist man mit der <b>Shell32<\/b>-Bibliothek hier am Ende der Fahnenstange angekommen. Sie enth&auml;lt keine Methoden, um an die Systemnamen zu kommen. Gottlob gibt es aber die in fr&uuml;heren Betr&auml;gen bereits erw&auml;hnte <b>Type Library<\/b> <b>oleexp<\/b>. Vorgestellt wurde sie etwa im Beitrag <b>Explorer Control <\/b>(Shortlink 1096). Sie stellt, so Sie sie in die Verweise aufnehmen, alle Klassen und <b>Interfaces<\/b> bereit, die f&uuml;r das Auslesen der Systemnamen ben&ouml;tigt werden.<\/p>\n<p>Die Bibliothek wird &uuml;brigens von der Demo beim Start des <b>Intro<\/b>-Formulars <b>frmIntro<\/b> automatisch geladen und sollte sich dazu im Verzeichnis der Datenbank befinden:<\/p>\n<pre>On Error Resume <span style=\"color:blue;\">Next<\/span>\r\nReferences.AddFromFile CurrentProject.Path & \"\\oleexp.tlb\"<\/pre>\n<p>Die Prozedur <b>StorePropertyKeys<\/b> im gesonderten Modul <b>mdlPropStore<\/b> ermittelt dann alle Systemnamen und speichert sie in der Tabelle <b>tblSysProperties<\/b>. Um es klarzustellen: Dieses Modul brauchen Sie in Ihrer produktiven Datenbank sp&auml;ter nicht mehr und eben so wenig den Verweis auf die Bibliothek <b>oleexp<\/b>!<\/p>\n<p>Es dient hier ausschlie&szlig;lich dazu, um die Tabelle zu f&uuml;llen, die dann die gefragten Systemnamen enth&auml;lt. Nur diese brauchen Sie schlie&szlig;lich in Ihre Datenbank zu &uuml;bernehmen.<\/p>\n<p>Der Aufbau der Tabelle ergibt sich aus Bild 4. Das Feld Systemname erh&auml;lt den <b>Property<\/b>-Namen, wie etwa <b>System.Author<\/b>. In <b>Bezeichnung<\/b> steht dann die deutsche &uuml;bersetzung, wie <b>Autoren<\/b>. Alle anderen Felder sind optional und nur informativ. In <b>Type<\/b> steht der Datentyp, wie etwa <b>String<\/b> oder <b>Integer<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/tblSysProperties_DS.png\" alt=\"In der Entwurfsansicht der Tabelle tblSysProperties ist das Feld Systemname eindeutig indiziert\" width=\"600\" height=\"458,8235\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: In der Entwurfsansicht der Tabelle tblSysProperties ist das Feld Systemname eindeutig indiziert<\/span><\/b><\/p>\n<p>Da die Methode <b>ExtendedProperty<\/b> immer Strings zur&uuml;ckgibt, kann man nicht erkennen, um welche Art von Wert es sich handelt. <b>Type<\/b> gibt einen R&uuml;ckschluss darauf. <b>Flags<\/b> wiederum ist ein Feld, das Hexadezimal-Strings ausgibt, welche weitere Informationen &uuml;ber die Art der Eigenschaft hervorbringen.<\/p>\n<p>Es f&uuml;hrt hier zu weit, dies zu erl&auml;utern und ich verweise auf den auskommentierten Block <b>Property Type Flags<\/b> im Kopf des Moduls <b>mdlPropStore<\/b>.<\/p>\n<p><!--30percent--><\/p>\n<p><b>HasCategory<\/b> schlie&szlig;lich gibt Auskunft dar&uuml;ber, ob es sich bei der Eigenschaft um ein Element einer bestimmten Kategorie handelt. Eigenschaften k&ouml;nnen n&auml;mlich kategorisiert werden. Die Hauptkategorie ist <b>System<\/b>. Das sind alle in Windows verbauten Eigenschaften, wie beispielsweise <b>System.FileOwner<\/b>. Hier kann es aber Unterkategorien geben. Bei Bildern etwa kommt die Kategorie <b>System.Image<\/b> ins Spiel, die selbst keine Eigenschaft darstellt. <b>System.Image.HorizontalSize<\/b> aber gibt die horizontale Ausdehnung der Bilddatei zur&uuml;ck. Alle Systemnamen, die mehr, als einen Punkt enthalten, sind Teil einer solchen Unterkategorie.<\/p>\n<p>Eigenschaften hingegen, die von installierten Programmen ermittelt werden, haben nicht die Hauptkategorie <b>System<\/b>, sondern eigene. Hier ist auf dem Rechner etwa die <b>Corel Graphics Suite<\/b> installiert, die zus&auml;tzliche <b>Property Handler<\/b> implementiert.<\/p>\n<p>Die Hauptkategorie ist hier <b>Corel<\/b> und eine Eigenschaft w&auml;re <b>Corel.File.CompressionRatio<\/b>, die zur&uuml;ckgibt, wie stark die Bilddatei komprimiert ist. Das allerdings funktioniert nur mit den speziellen <b>Corel<\/b>-Dateitypen, wie <b>.cdr<\/b>. Wie sich schlie&szlig;lich der Inhalt der Tabelle in der Datenblattansicht darstellt, zeigt Bild 5.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/tblSysProperties_RT.png\" alt=\"Ausschnitt der Datenblattansicht der Tabelle tblSysProperties mit allen f&uuml;r das System ermittelten Shell-Properties\" width=\"700\" height=\"334,6065\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Ausschnitt der Datenblattansicht der Tabelle tblSysProperties mit allen f&uuml;r das System ermittelten Shell-Properties<\/span><\/b><\/p>\n<p>Nur der Vollst&auml;ndigkeit halber ist in Listing 2 die Routine abgebildet, welche die Systemnamen enumeriert und in die Tabelle speichert. Es liegt deutlich au&szlig;erhalb des Horizonts dieses Beitrags, ihre Funktionsweise zu erl&auml;utern, denn hier kommen recht exotische <b>Interfaces<\/b> und Methoden zum Einsatz. Es sollte reichen, wenn Sie wissen, <b>was<\/b> sie tut.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>StorePropertyKeys(<span style=\"color:blue;\">Optional<\/span> What<span style=\"color:blue;\"> As <\/span>oleexp.PROPDESC_ENUMFILTER, _\r\n             <span style=\"color:blue;\">Optional<\/span> DeleteExisting<span style=\"color:blue;\"> As Boolean<\/span> = <span style=\"color:blue;\">True<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>IPSys<span style=\"color:blue;\"> As <\/span>IPropertySystem\r\n     <span style=\"color:blue;\">Dim <\/span>IPropDesc<span style=\"color:blue;\"> As <\/span>IPropertyDescription\r\n     <span style=\"color:blue;\">Dim <\/span>IPList<span style=\"color:blue;\"> As <\/span>IPropertyDescriptionList\r\n     <span style=\"color:blue;\">Dim <\/span>nProp<span style=\"color:blue;\"> As Long<\/span>, lpProp<span style=\"color:blue;\"> As Long<\/span>, lType<span style=\"color:blue;\"> As Long<\/span>, lFlag<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>rs<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>cnt<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">If <\/span>DeleteExisting<span style=\"color:blue;\"> Then<\/span> CurrentDb.Execute \"DELETE FROM tblSysProperties\"\r\n     <span style=\"color:blue;\">Set<\/span> rs = CurrentDb.OpenRecordset(\"SELECT * FROM tblSysProperties\", dbOpenDynaset)\r\n     PSGetPropertySystem String2UID(IID_IPropertySystem), IPSys\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     IPSys.EnumeratePropertyDescriptions What, String2UID(IID_IPropertyDescriptionList), IPList\r\n     IPList.GetCount nProp\r\n     For i = 0 To (nProp - 1)\r\n         IPList.GetAt i, String2UID(IID_IPropertyDescription), IPropDesc\r\n         IPropDesc.GetDisplayName lpProp\r\n         <span style=\"color:blue;\">If <\/span>lpProp &lt;&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             rs.Add<span style=\"color:blue;\">New<\/span>\r\n             rs!Bezeichnung = SysAllocString(lpProp) & \"\"\r\n             CoTaskMemFree lpProp\r\n             IPropDesc.GetCanonicalName lpProp\r\n             IPropDesc.GetDisplayType lType\r\n             IPropDesc.GetTypeFlags PDTF_MASK_ALL, lFlag\r\n             rs!Systemname = SysAllocString(lpProp)\r\n             CoTaskMemFree lpProp\r\n             rs!Type = Choose(1 + lType, \"String\", \"Number\", \"Boolean\", \"DateTime\", \"Enum\")\r\n             rs!Flags = Hex(lFlag)\r\n             rs!HasCategory = <span style=\"color:blue;\">UBound<\/span>(<span style=\"color:blue;\">Split<\/span>(rs!Systemname.Value, \".\")) &gt; 1\r\n             Err.Clear\r\n             rs.Update\r\n             <span style=\"color:blue;\">If <\/span>Err.Number &lt;&gt; 0<span style=\"color:blue;\"> Then<\/span> rs.CancelUpdate Else cnt = cnt + 1\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     rs.Close\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Function <\/span>String2UID(sGUID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>oleexp.UUID\r\n     oleexp.CLSIDFromString sGUID, String2UID\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Diese Prozedur enumeriert alle auf dem System verf&uuml;gbaren Systemnamen und speichert sie<\/span><\/b><\/p>\n<p>Sie l&ouml;scht zun&auml;chst optional (Parameter <b>DeleteExisting<\/b>) alle Eintr&auml;ge in der Tabelle <b>tblSysProperties<\/b> und &ouml;ffnet dann ein Recordset <b>rs<\/b> auf sie, um sie erneut mit Datens&auml;tzen zu f&uuml;llen. Mit <b>PSGetPropertySystem<\/b> wird folgend ein genereller Verweis auf das <b>Property System<\/b> von Windows erhalten, was anhand einer speziellen <b>Interface-GUID<\/b> (<b>IID_IPropertySystem<\/b>) geschieht. <b>EnumeratePropertyDescriptions<\/b> ist dann auch schon die Methode, welche die Liste der Eigenschaftennamen &ouml;ffnet.<\/p>\n<p>Die Zahl derer ermittelt <b>GetCount<\/b> und eine Schleife arbeitet nun alle Eintr&auml;ge ab. Verschiedene Methoden berechnen den lokalen Anzeigenamen (<b>Bezeichnung<\/b>), den Systemnamen (<b>GetCanonicalName<\/b>), den Datentyp (<b>GetDisplayType<\/b>) und die Flags (<b>GetTypeFlags<\/b>). Die Ergebnisse werden jeweils den Feldern eines neuen Datensatzes (<b>rs.AddNew<\/b>) zugewiesen. Damit ist die Tabelle mit allen registrierten Eigenschaftennamen gef&uuml;llt.<\/p>\n<p>Der Prozedur <b>StorePropertyKeys<\/b> k&ouml;nnen Sie optional einen Filterparameter <b>What<\/b> &uuml;bergeben, dessen Wert den Enumerationskonstanten <b>PROPDESC_FILTER<\/b> der Bibliothek <b>oleexp<\/b> entstammt. Der Standard ist <b>0<\/b>, was der Konstanten <b>PDEF_ALL<\/b> entspricht und damit eigentlich alle Systemnamen ermitteln sollte. Ein anderer w&auml;re etwa <b>PDEF_VIEWABLE<\/b>, der nur jene Eigenschaften enumeriert, die als String angezeigt werden k&ouml;nnen. Oder <b>PDEF_COLUMN<\/b>, was nur jene Eigenschaften zur&uuml;ckgibt, die auch der Explorer zur Auswahl anbietet. Seltsamerweise kommt es vor, dass in den &uuml;ber <b>PDEF_ALL<\/b> erhaltenen Datens&auml;tzen manche fehlen, die etwa aus <b>PDEF_VIEWABLE<\/b> kommen.<\/p>\n<p>Deshalb ist es gegebenenfalls sinnvoll, die Prozedur mehrmals mit unterschiedlichen Konstanten aufzurufen und <b>DeleteExisting<\/b> dabei auf <b>False<\/b> zu setzen. Die Tabelle wird dann trotzdem keine Duplikate enthalten, weil das Feld <b>Systemname<\/b> eindeutig indiziert ist, was &uuml;brigens der Grund daf&uuml;r ist, weshalb die Schleife der Prozedur in ein <b>On Error Resume Next<\/b> eingebunden ist. &uuml;brigens sind Sie mit der Konstanten <b>PDEF_SYSTEM<\/b> mit Einschr&auml;nkungen auf der sicheren Seite, weil damit nur die in Windows verbauten Eigenschaften zur&uuml;ckgegeben werden. Das allerdings gilt nur f&uuml;r eine bestimmte Windows-Version. <b>Windows 10<\/b> etwa h&auml;lt mehr Systemnamen vor, als <b>Windows 7<\/b>.<\/p>\n<p>Auf meinem System fanden sich schlie&szlig;lich 733 Eigenschaften ein, die auf Dateien und Verzeichnisse angewandt werden k&ouml;nnen. Welche Eigenschaftsnamen dabei bei welchen Dateitypen greifen, l&auml;sst sich leider nicht angeben. Der einfachste Weg ist daher, testweise alle m&ouml;glichen Eigenschaften der besprochenen Prozedur <b>SHGetPropertyString<\/b> zu &uuml;bergeben. Kann die <b>Shell<\/b> zu einer Datei mit dem Eigenschaftennamen nichts anfangen, so gibt die Funktion einen Leer-String zur&uuml;ck. Die Funktion ist absolut fehlertolerant. Sie k&ouml;nnten sich auch selbst Systemnamen ausdenken, die klaglos verarbeitet werden, aber eben ein leeres Ergebnis zeitigen.<\/p>\n<p>Zusammengefasst k&ouml;nnen wir festhalten, dass Sie neben der Prozedur <b>SHGetPropertyString <\/b>nur noch die gef&uuml;llte Tabelle <b>tblSysProperties<\/b> ben&ouml;tigen, um in Ihrem Projekt Datei- und Ordnereigenschaften zu ermitteln. Den Verweis auf die <b>Shell32<\/b>-Bibliothek sollten Sie dabei nicht vergessen. Eine Beispielanwendung zeigt nun das Formular <b>frmFileProps<\/b> der Demo-Datenbank.<\/p>\n<h2>Praxisanwendung<\/h2>\n<p>Starten Sie das Formular <b>frmFileProps<\/b>, so erwartet Sie ein Textfeld oben, in welches Sie den Pfad einer Datei eingeben k&ouml;nnen. &uuml;ber den Button rechts daneben &ouml;ffnen Sie einen Dateiauswahldialog, mit dem die Datei komfortabler ausgew&auml;hlt werden kann. Unmittelbar danach f&uuml;llt sich das Unterformular mit den Eigenschaftsdaten. Neben der lokalisierten Bezeichnung &#8211; unter einem spanischen Windows st&uuml;nden hier eben die spanischen Pendants &#8211; steht in der zweiten Spalte der <b>Systemname<\/b> der Eigenschaft und in der letzten deren Wert.<\/p>\n<p>In Bild 6 wurde die Datei <b>mscomctl.ocx<\/b> ausgew&auml;hlt, die etwa das Treeview beherbergt. Die Shell <b>konnte<\/b> hier 31 Eigenschaften auswerten. Interessant ist, dass zu diesen etwa auch die Dateiversion der <b>PE<\/b>-Datei geh&ouml;rt (<b>System.FileVersion<\/b>), welche allein schon Sie sonst nur &uuml;ber eine umfangreiche <b>API<\/b>-Prozedur ermitteln k&ouml;nnten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/frmFileProps_1.png\" alt=\"Die Liste der 31 ermittelten Eigenschaften der Datei mscomctl.ocx im Formular frmFileProps im Ausschnitt\" width=\"650\" height=\"380,0547\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Die Liste der 31 ermittelten Eigenschaften der Datei mscomctl.ocx im Formular frmFileProps im Ausschnitt<\/span><\/b><\/p>\n<p>Nicht uninteressant sind auch <b>System.FileAttributes<\/b> und <b>System.FileOwner<\/b>, die Aufschluss dar&uuml;ber geben, ob die Datei ohne administrative Rechte gel&ouml;scht, verschoben oder &uuml;berschrieben werden kann.<\/p>\n<p>Wenn Sie ein Verzeichnis selbst inspizieren m&ouml;chten, so hilft der Dateiauswahldialog nicht weiter. Tragen Sie in diesem Fall den Pfad manuell ein und klicken Sie anschlie&szlig;end auf den Button mit dem <b>Refresh<\/b>-Symbol, der auch sonst eine Neuabfrage der Eigenschaften bewirkt.<\/p>\n<p>Die Checkbox <b>Nur Basis-Infos<\/b> ist standardm&auml;&szlig;ig deaktiviert und f&uuml;hrt dann zur Ausgabe aller Eigenschaften. Markieren Sie diese, so filtert das Formular jene Eigenschaften, die keine Unterkategorien aufweisen.<\/p>\n<p>Das wird im n&auml;chsten Beispiel deutlicher. In Bild 7 wurde eine <b>JPEG<\/b>-Bilddatei ausgew&auml;hlt. Sind die <b>Basis-Infos<\/b> aktiviert, so fehlen in der Liste jene Eigenschaften, die in der Abbildung farblich hervorgehoben wurden. Die geh&ouml;ren n&auml;mlich zu den Kategorien <b>System.Image<\/b>, <b>System.Media<\/b> und <b>System.Photo<\/b> und zeigen erweiterte Eigenschaften zum Bild an. Wenn Sie etwa die Abmessungen eines Bilds erfahren m&ouml;chten, so &uuml;bergeben Sie der Prozedur <b>SHGetPropertyString <\/b>einfach den Systemnamen <b>System.Image.Dimensions<\/b>. Einfacher geht&#8220;&#8220;s nun wirklich nicht mehr!<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/frmFileProps_Ext.png\" alt=\"Die kompletten Eigenschaften der JPG-Datei weisen zus&auml;tzlich die hervorgehobenen Bereiche aus\" width=\"650\" height=\"722,814\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Die kompletten Eigenschaften der JPG-Datei weisen zus&auml;tzlich die hervorgehobenen Bereiche aus<\/span><\/b><\/p>\n<p>Zu den erweiterten Eigenschaften geh&ouml;ren auch jene, die durch zus&auml;tzlich installierte <b>Property Handler<\/b> ermittelt werden. Diese haben immer Unterkategorien. In Bild 8 wurde etwa eine <b>PDF<\/b>-Datei geladen, wobei Sie hier nur einen Ausschnitt der Eigenschaften sehen. Das kostenlose Programm <b>PDF-XChange-Viewer <\/b>der Firma <b>Tracker Software<\/b> ist ein sehr empfehlenswerter Ersatz f&uuml;r den <b>Adobe Reader<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/AdditionalProps.png\" alt=\"Durch installierte Programme k&ouml;nnen zus&auml;tzliche Dateieigenschaften ermittelt werden\" width=\"650\" height=\"140,8333\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Durch installierte Programme k&ouml;nnen zus&auml;tzliche Dateieigenschaften ermittelt werden<\/span><\/b><\/p>\n<p>Sein <b>Property Handler<\/b> ermittelt nun Eigenschaften des Dokuments, wie Erstellanwendung (<b>Producer<\/b>), Spezifikation (<b>SpecVersion<\/b>) und Verschl&uuml;sselung (<b>Encrypted<\/b>). Diese Eigenschaften ermittelt &uuml;brigens die Prozedur <b>StorePropertyKeys<\/b>, wenn Sie im Parameter <b>What<\/b> die Konstante <b>PDEF_NONSYSTEM<\/b> &uuml;bergeben. <\/p>\n<p>Vielleicht f&auml;llt Ihnen beim Testen auf, dass die erste Zeile der Eigenschaften jeweils die Bezeichnung <b>Verbs<\/b> aufweist. Das ist tats&auml;chlich keine &uuml;ber die Funktion <b>SHGetPropertyString <\/b>erhaltene Eigenschaft, sondern eine Liste von semikolonseparierten Datei- oder Ordneroperationen, die auf das Element ausgef&uuml;hrt werden k&ouml;nnen. Die wird mithilfe einer gesonderten Prozedur ermittelt, auf die wir noch zu sprechen kommen. F&uuml;r diesen Eintrag gibt es au&szlig;erdem eine Sonderfunktion: Doppelklicken Sie auf den Text <b>Verbs<\/b>, so &ouml;ffnet sich ein Meldungsfenster (siehe Bild 9), das die m&ouml;glichen Operationen &uuml;bersichtlicher ausgibt. Das ist genau die Liste, die Ihnen auch im Kontextmen&uuml; pr&auml;sentiert wird, wenn Sie im Explorer auf eine Datei oder ein Verzeichnis rechtklicken.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/Popup_Verbs.png\" alt=\"Liste der m&ouml;glichen Dateioperationen (Verbs) auf die JPEG-Datei\" width=\"425\" height=\"522,8935\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Liste der m&ouml;glichen Dateioperationen (Verbs) auf die JPEG-Datei<\/span><\/b><\/p>\n<h2>Aufbau der Anwendung<\/h2>\n<p>Im Prinzip funktioniert sie so: Alle Systemnamen der Tabelle <b>tblSysProperties<\/b> werden nacheinander der Funktion <b>SHGetPropertyString<\/b> &uuml;bergeben. Nur jene, die keinen Leer-String zur&uuml;ckgeben, kommen dann ins Ergebnis. Die Werte werden in einer neuen Tabelle <b>tblFileProps<\/b> gespeichert, die die Datenherkunft f&uuml;r das Unterformular <b>sfrmFileProps<\/b> bildet. Ihren Entwurf, der dem der Tabelle <b>tblSysProperties<\/b> &auml;hnelt, zeigt Bild 10. Den Wert einer <b>Eigenschaft<\/b> speichert allerdings hier das gleichnamige Feld, welches sicherheitshalber im <b>Memo<\/b>-Format daherkommt, weil etwa die Liste der <b>Verbs<\/b> den Zeichenumfang eines Textfelds sprengen k&ouml;nnte.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/tblFileProps_DS.png\" alt=\"Die Entwurfsansicht der Tabelle tblFileProps f&uuml;r die Anzeige im Unterformular sfrmFileProps\" width=\"650\" height=\"446,9459\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Die Entwurfsansicht der Tabelle tblFileProps f&uuml;r die Anzeige im Unterformular sfrmFileProps<\/span><\/b><\/p>\n<p>Den Formularentwurf finden Sie in Bild 11. Das Unterformular <b>sfrmFileProps<\/b> ist auf den Modus <b>Datenblatt<\/b> eingestellt und hat als Datenherkunft die einzige Abfrage <b>qry_FileProps<\/b> der Beispieldatenbank. Sie gibt lediglich den Inhalt der Tabelle <b>tblFileProps<\/b>, sortiert nach dem Feld <b>Bezeichnung<\/b>, zur&uuml;ck.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2018_02\/frmFileProps_DS.png\" alt=\"Die Entwurfsansicht des Formulars frmFileProps zeigt das Unterformular sfrmFileProps zur Auflistung der Dateieigenschaften\" width=\"700\" height=\"441,4416\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Die Entwurfsansicht des Formulars frmFileProps zeigt das Unterformular sfrmFileProps zur Auflistung der Dateieigenschaften<\/span><\/b><\/p>\n<p>Der wesentliche VBA-Code wird als Reaktion auf die Ereignisse <b>Click<\/b> des Dateiauswahl-Button oder des Refresh-Button ausgef&uuml;hrt. Nur beim Laden des Formulars laufen zus&auml;tzlich einige Initialisierungsaufgaben ab. Die Ereignisprozedur <b>Form_Load<\/b> stellt Listing 3 dar. Hier wird das globale Recordset <b>rsSys<\/b> auf die Herkunft <b>tblSysProperties<\/b> eingestellt, weil seine Daten immer wieder ben&ouml;tigt werden. Au&szlig;erdem wird die ebenfalls formularglobale Objektvariable <b>oShell<\/b> auf eine neue Instanz der Klasse <b>Shell32.Shell<\/b> gesetzt und im String <b>sDir<\/b> der Pfad der Datenbankdatei festgelegt, den wir als Startverzeichnis des Dateiauswahldialogs verwenden werden. Die daf&uuml;r verantwortliche Prozedur geben wir hier nicht wieder &#8211; sie verbirgt sich hinter der Ereignisprozedur <b>cmdOF_Click<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>rsSys<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n<span style=\"color:blue;\">Private <\/span>oShell<span style=\"color:blue;\"> As <\/span>Shell32.Shell\r\n<span style=\"color:blue;\">Private <\/span>sDir<span style=\"color:blue;\"> As String<\/span> \r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> rsSys = CurrentDb.OpenRecordset _\r\n        (\"SELECT * FROM tblSysProperties\", dbOpenSnapshot)\r\n     <span style=\"color:blue;\">Set<\/span> oShell = <span style=\"color:blue;\">New<\/span> Shell32.Shell\r\n     sDir = CurrentProject.Path\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Initialisierungsvorg&auml;nge im Formularereignis Beim Laden<\/span><\/b><\/p>\n<p>Sowohl die Auswahl einer Datei, wie auch der Klick auf den Refresh-Button, rufen die eigentliche Funktion, die Prozedur <b>EnumProps<\/b>, in Listing 4 aus. Im Wesentlichen durchl&auml;uft hier eine Schleife alle Datens&auml;tze der Tabelle <b>tblSysProperties<\/b> und entnimmt ihr jeweils den Eigenschaftennamen, um ihn in der Variablen <b>sSys<\/b> zwischenzuspeichern. Ob nur Basis-Infos erhalten werden sollen, entscheidet die Boole-Variable <b>bDoIt<\/b> anhand des Werts der Checkbox <b>chkBaseInfo<\/b> (in <b>bBase<\/b>) und der Berechnung, ob der Systemname mehr, als einen Punkt, enth&auml;lt. Das ermittelt die <b>Split<\/b>-Funktion im Verein mit der <b>UBound<\/b>-Funktion. Der zusammengesetzte Boole-Ausdruck mag etwas kryptisch aussehen, reduziert jedoch den Code und damit das Listing hier.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>EnumProps(sFile<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>rs<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>sSys<span style=\"color:blue;\"> As String<\/span>, sProp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bBase<span style=\"color:blue;\"> As Boolean<\/span>,  bDoIt<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>arrProp()<span style=\"color:blue;\"> As String<\/span>\r\n     bBase = Me!chkBaseInfo.Value\r\n     CurrentDb.Execute \"DELETE FROM tblFileProps\"\r\n     <span style=\"color:blue;\">Set<\/span> rs = CurrentDb.OpenRecordset  (\"SELECT *  FROM tblFileProps\")\r\n     rsSys.MoveFirst\r\n     <span style=\"color:blue;\">Set<\/span> oItm = Nothing\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rsSys.EOF\r\n         sSys = rsSys!Systemname\r\n         bDoIt = ((<span style=\"color:blue;\">UBound<\/span>(<span style=\"color:blue;\">Split<\/span>(sSys, \".\")) = 1)  And bBase) Or (<span style=\"color:blue;\">Not<\/span> bBase)\r\n         <span style=\"color:blue;\">If <\/span>bDoIt<span style=\"color:blue;\"> Then<\/span>\r\n             sProp = SHGetPropertyString(sFile, sSys)\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(sProp) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 rs.Add<span style=\"color:blue;\">New<\/span>\r\n                 rs!Bezeichnung = rsSys!Bezeichnung\r\n                 rs!Eigenschaft = sProp\r\n                 rs!Systemname = rsSys!Systemname\r\n                 rs.Update\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         rsSys.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n''''   ... (Plus Verbs) ...\r\n     rs.Close\r\n     Me!sfrmProps.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Diese Prozedur enumeriert die Dateieigenschaften<\/span><\/b><\/p>\n<p>Den R&uuml;ckgabewert von <b>SHGetPropertyString<\/b> (Modul <b>mdlPropsShell<\/b>) speichert <b>sProp<\/b>. Ist die L&auml;nge dieses Strings gro&szlig;er, als <b>0<\/b>, so kommt es nur Anlage eines neuen Datensatzes im auf der Tabelle <b>tblFileProps<\/b> basierenden Recordset <b>rs<\/b>. Sind alle Eigenschaften enumeriert, so schlie&szlig;t das Recordset und das Unterformular wird mittels <b>Requery<\/b> neu gef&uuml;llt.<\/p>\n<p>Im Listing fehlt allerdings noch die Anlage des einen Datensatzes f&uuml;r die <b>Verbs<\/b>:<\/p>\n<pre>    rs.Add<span style=\"color:blue;\">New<\/span>\r\n     rs!Bezeichnung = \"Verbs\"\r\n     rs!Eigenschaft = SHGetFileVerbs(sFile)\r\n     rs.Update<\/pre>\n<p>Die Liste der m&ouml;glichen Datei- oder Verzeichnisoperationen ist in die Funktion <b>SHGetFileVerbs<\/b> (ebenfalls Modul <b>mdlPropsShell<\/b>) ausgelagert, die Listing 5 zeigt.<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>SHGetFileVerbs(sFile<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>sFld<span style=\"color:blue;\"> As String<\/span>, sFil<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>oFld<span style=\"color:blue;\"> As <\/span>Shell32.Folder3\r\n     <span style=\"color:blue;\">Dim <\/span>oItm<span style=\"color:blue;\"> As <\/span>Shell32.ShellFolderItem\r\n     <span style=\"color:blue;\">Dim <\/span>vrb<span style=\"color:blue;\"> As <\/span>FolderItemVerb\r\n     <span style=\"color:blue;\">Dim <\/span>sVerbs<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>oSH Is Nothing<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Set<\/span> oSH = <span style=\"color:blue;\">New<\/span> Shell32.Shell\r\n     sFld = <span style=\"color:blue;\">Left<\/span>(sFile, <span style=\"color:blue;\">InStrRev<\/span>(sFile, \"\\\") - 1)\r\n     sFil = <span style=\"color:blue;\">Mid<\/span>(sFile, <span style=\"color:blue;\">InStrRev<\/span>(sFile, \"\\\") + 1)\r\n     <span style=\"color:blue;\">Set<\/span> oFld = oSH.NameSpace(CStr(sFld))\r\n     <span style=\"color:blue;\">Set<\/span> oItm = oFld.Items.Item(CStr(sFil))\r\n     <span style=\"color:blue;\">If <\/span>oItm Is Nothing<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Function<\/span>\r\n     For Each vrb In oItm.Verbs\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(vrb.Name) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             sVerbs = sVerbs \r\n                        & <span style=\"color:blue;\">Replace<\/span>(vrb.Name, \"&\", \"\") & \";\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> vrb\r\n     SHGetFileVerbs = sVerbs\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Diese Funktion ermittelt alle m&ouml;glichen Dateioperationen<\/span><\/b><\/p>\n<p>Sie gleicht weitgehend der Funktion <b>SHGetPropertyString<\/b> und ermittelt aus dem &uuml;bergebenen Dateinamen (<b>sFile<\/b>) zun&auml;chst ein <b>ShellFolderItem<\/b>-Objekt (<b>oItm<\/b>). Dann aber durchl&auml;uft sie die Auflistung der <b>Verbs<\/b> des <b>Items<\/b> &uuml;ber die Iterator-Variable <b>vrb<\/b>. Das ist ebenfalls ein Objekt (<b>FolderItemVerb<\/b>), welches etwa die Eigenschaft <b>Name<\/b> aufweist. Das ist die Bezeichnung der Operation, wie sie Bild 9 ausgibt. Unsch&ouml;n allerdings ist, dass diese Bezeichnungen meist ein <b>&#038;<\/b> im Text enthalten. Das r&uuml;hrt daher, dass diese im Grunde Eintr&auml;ge des Kontextmen&uuml;s darstellen. Der Buchstabe nach dem <b>&#038;<\/b> ist der Shortcut, &uuml;ber den diese Operation auf der Tastatur ebenfalls ausgel&ouml;st werden kann. Die <b>Replace<\/b>-Funktion eliminiert dieses Zeichen in der Prozedur. In <b>sVerbs<\/b> werden alle Operationen durch ein Semikolon getrennt aneinandergereiht. Diese Variable liefert auch den R&uuml;ckgabewert der Funktion. Hat diese Liste von Dateioperationen mehr als informativen Nutzen Nun, das Objekt <b>ForderItemVerb<\/b> hat auch noch eine Methode <b>DoIt<\/b>. Ruft man sie auf, so f&uuml;hrt das <b>Verb<\/b>-Objekt seine Operation auch tats&auml;chlich aus:<\/p>\n<pre>vrb.DoIt<\/pre>\n<p>G&auml;be <b>vrb.Name<\/b> den String <b>Vorschau<\/b> zur&uuml;ck, so f&uuml;hrte das <b>Doit<\/b> etwa bei einer <b>JPEG<\/b>-Datei dazu, dass sich die <b>Windows-Fotoanzeige<\/b> &ouml;ffnet. Sie k&ouml;nnen damit auf einfache Weise eine externe Datei oder auch ein Verzeichnis steuern. F&uuml;hren Sie sich einfach nochmals die Liste in <b>Bild 9 <\/b>zu Gem&uuml;te. Alle dort aufgelisteten Befehle lassen sich nun auf einfachste Weise anweisen. Nicht unerw&auml;hnt allerdings sollte bleiben, dass diese Operationen grunds&auml;tzlich &uuml;ber die <b>Shell<\/b> laufen und deshalb unter Umst&auml;nden zus&auml;tzliche Dialoge erscheinen lassen, wie etwa die Anweisung <b>Verkn&uuml;pfung erstellen<\/b>. Es l&auml;uft schlicht genau Dasselbe ab, wie wenn Sie die Anweisung &uuml;ber das Kontextmen&uuml; im Explorer aufrufen.<\/p>\n<p>Um Ihnen den direkten Aufruf eines Befehls zu vereinfachen, gibt es im Modul <b>mdlPropsShell<\/b> noch die Prozedur <b>ExecuteVerb<\/b>, der Sie neben dem Namen der Datei oder des Verzeichnisses noch den Namen der Operation &uuml;bergeben. Ein Beispielaufruf w&auml;re dieser:<\/p>\n<pre>ExecuteVerb Currentdb.Name, \"Eigenschaften\"<\/pre>\n<p>Hier wird der Pfad der aktuellen Datenbankdatei eingesetzt und angewiesen, dass sich zu ihr der Dateieigenschaften-Dialog &ouml;ffnen soll. Funktioniert problemlos! Nachteilig ist nur, dass diese Operationsnamen immer lokalisiert sind. Auf einem spanischen Windows wird dieser Aufruf leider nicht zum Erfolg f&uuml;hren. Ein Workaround hierf&uuml;r w&auml;re leider ziemlich kompliziert und w&uuml;rde abermals den Einsatz der Bibliothek <b>oleexp<\/b> erfordern.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DateieigenschaftenErmitteln.zip<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/81E3A9F2-5BCF-4472-9791-59464E6E9618\/aiu_1123.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Access-Datenbanken werden ja nicht immer nur Personen, Objekte und Vorg&auml;nge verwaltet. Nicht selten lesen Sie auch Dateien und deren Eigenschaften in Tabellen ein. Denken Sie etwa an die Informationen, die sie Audio- oder Videodateien f&uuml;r eine Medienverwaltung abringen m&ouml;chten. Mit dem R&uuml;stzeug von VBA allein kommen Sie hier nicht weit, wohl aber mit den Shell-Objekten von Windows.<\/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":[66022018,662018,44000026],"tags":[],"class_list":["post-55001123","post","type-post","status-publish","format-standard","hentry","category-66022018","category-662018","category-Interaktiv"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Dateieigenschaften ermitteln - 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\/Dateieigenschaften_ermitteln\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dateieigenschaften ermitteln\" \/>\n<meta property=\"og:description\" content=\"In Access-Datenbanken werden ja nicht immer nur Personen, Objekte und Vorg&auml;nge verwaltet. Nicht selten lesen Sie auch Dateien und deren Eigenschaften in Tabellen ein. Denken Sie etwa an die Informationen, die sie Audio- oder Videodateien f&uuml;r eine Medienverwaltung abringen m&ouml;chten. Mit dem R&uuml;stzeug von VBA allein kommen Sie hier nicht weit, wohl aber mit den Shell-Objekten von Windows.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T21:18:48+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/e5e0fec6fb914795a4cc1090b5049d19\" \/>\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=\"22\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateieigenschaften_ermitteln\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateieigenschaften_ermitteln\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Dateieigenschaften ermitteln\",\"datePublished\":\"2020-05-13T21:18:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateieigenschaften_ermitteln\\\/\"},\"wordCount\":3898,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateieigenschaften_ermitteln\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/e5e0fec6fb914795a4cc1090b5049d19\",\"articleSection\":[\"2\\\/2018\",\"2018\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateieigenschaften_ermitteln\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateieigenschaften_ermitteln\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateieigenschaften_ermitteln\\\/\",\"name\":\"Dateieigenschaften ermitteln - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateieigenschaften_ermitteln\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateieigenschaften_ermitteln\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/e5e0fec6fb914795a4cc1090b5049d19\",\"datePublished\":\"2020-05-13T21:18:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateieigenschaften_ermitteln\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateieigenschaften_ermitteln\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateieigenschaften_ermitteln\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/e5e0fec6fb914795a4cc1090b5049d19\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/e5e0fec6fb914795a4cc1090b5049d19\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Dateieigenschaften_ermitteln\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dateieigenschaften ermitteln\"}]},{\"@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":"Dateieigenschaften ermitteln - 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\/Dateieigenschaften_ermitteln\/","og_locale":"de_DE","og_type":"article","og_title":"Dateieigenschaften ermitteln","og_description":"In Access-Datenbanken werden ja nicht immer nur Personen, Objekte und Vorg&auml;nge verwaltet. Nicht selten lesen Sie auch Dateien und deren Eigenschaften in Tabellen ein. Denken Sie etwa an die Informationen, die sie Audio- oder Videodateien f&uuml;r eine Medienverwaltung abringen m&ouml;chten. Mit dem R&uuml;stzeug von VBA allein kommen Sie hier nicht weit, wohl aber mit den Shell-Objekten von Windows.","og_url":"https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T21:18:48+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/e5e0fec6fb914795a4cc1090b5049d19","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"22\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Dateieigenschaften ermitteln","datePublished":"2020-05-13T21:18:48+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/"},"wordCount":3898,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/e5e0fec6fb914795a4cc1090b5049d19","articleSection":["2\/2018","2018","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/","url":"https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/","name":"Dateieigenschaften ermitteln - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/e5e0fec6fb914795a4cc1090b5049d19","datePublished":"2020-05-13T21:18:48+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/e5e0fec6fb914795a4cc1090b5049d19","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/e5e0fec6fb914795a4cc1090b5049d19"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Dateieigenschaften_ermitteln\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Dateieigenschaften ermitteln"}]},{"@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\/55001123","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=55001123"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001123\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}