| |
Fortgeschrittene ProgrammierungDateieigenschaften von docx mit dsofile auslesen | | | Autor: Nobbi62 | Datum: 08.03.22 19:07 |
| Hallo,
bei mir läuft immer noch ein altes VB5-Prog, das noch 2 bis 3 Jahre durchhalten muss.
In diesem Programm werden u.a. mit der dsofile.dll die Eigenschaften eines Word-Doks ohne es zu öffnen ausgelesen.
Hat immer wunderbar funktionert (WinXP/Win7/Win10 mit Office 2003/2010/2019) und zwar sowohl mit doc-Dateien als auch mit docx-Dateien. Allerdings bin ich im Moment nicht ganz sicher, ob die Win10/Office19-Variante funktioniert hat. Voraussetzung war für die docx-Dateien die Version 2.1 der DLL (bei mir hat die ein Datum vom 1.5.2007).
Neuerdings funktioniert sie nur noch mit Doc-Dateien, bei Docx-Dateien kommt ein Automatisierungsfehler. Der Code ist (auszugsweise) folgendermaßen:
Dim objOleDocProps As DSOFile.OleDocumentProperties
Dim objSummProps As DSOFile.SummaryProperties
Set objOleDocProps = New DSOFile.OleDocumentProperties
objOleDocProps.Open "c:\Versuch.docx"
Set objSummProps = objOleDocProps.SummaryProperties
In der letzten Zeile steigt er mit Fehler aus, aber nur bei docx, nicht bei doc-Dateien.
Da die DLL mit Verweis eingebunden ist, sind im Objektkatalog auch die entsprechenden Eigenschaften/Methoden usw. vorhanden.
Bin leider etwas ratlos. Kann mir jemand helfen.
Danke schonmal
Nobbi | |
Re: Dateieigenschaften von docx mit dsofile auslesen | | | Autor: -Franky- | Datum: 10.03.22 11:45 |
| Hi
Vorweg: Ich kenne diese dsofile.dll nicht bzw hab ich noch nie mit gearbeitet. Was Ich Dir aber vorschlagen kann ist der Weg über die Interfaces IPropertyStore und IPropertyDescription. Damit lassen sich von allen Dateien und Ordner diverse Eigenschaften auslesen. Da es wohl etwas viel Code ist, nimmt dieses Forum das nicht direkt in den Code-Tags. Daher hier ein Link wo Du den Code von mir auch findest:
http://foren.activevb.de/forum/vb-classic/thread-417320/beitrag-417358/Re-Alternative-zu-objFolder-Get/
Mit freundlichen Grüßen
-Franky- | |
Re: Dateieigenschaften von docx mit dsofile auslesen | | | Autor: Nobbi62 | Datum: 10.03.22 15:31 |
| Vielen Dank erstmal.
Ich werde mir das genauer anschauen, wenn sich die Lösung mit der dsofile.dll nicht noch ergibt. Hat ja schließlich schon funktioniert....vielleicht ist es ja auch nur ein kurzfristiger Fehler in der derzeitigen Office-Version.
Habe übrigens auch schon andere Varianten des Eigenschaften-Abrufs durchgetestet...diese liefern aber alle nur ein paar Word-Eigenschaften (z.B. Titel, Autor, Company), aber eben nicht solche Daten wie Anzahl Seiten, Wörter und ähnliches.
Viele Grüße
Nobbi | |
Re: Dateieigenschaften von docx mit dsofile auslesen | | | Autor: Nobbi62 | Datum: 22.04.22 10:49 |
| Vielen Dank nochmal.
Hat etwas gedauert (hab deinen Code in VB5 eingefügt; auf mehrere Module verteilt, Split ersetzt) und nach einigen Fehlversuchen (hatte übersehen, dass Backslash statt Slash notwendig ist beim File) hat es jetzt auch funktioniert, sowohl bei Doc als auch bei Docx.
Jetzt würde mir nur noch ein Tip fehlen, wie ich ganz bestimmte Werte damit abfragen kann (z.B. Autor, Template, Name, Seiten usw.) oder muss ich immer das komplette Array durchforsten.
Viele Grüße
Nobbi | |
Re: Dateieigenschaften von docx mit dsofile auslesen | | | Autor: -Franky- | Datum: 22.04.22 15:30 |
| Hi
Schau dir mal die Funktion PropertyStore_GetValue_Str genau an. Diese erwartet einen Pointer auf ein IPropertyStore und einen PROPERTYKEY. Der PROPERTYKEY bestimmt daher was auszulesen ist. Wenn Du also die fmtid und pid vom Autor kennst, kannst diesen gezielt auslesen ohne die Schleife zu durchlaufen.
Mit freundlichen Grüßen
-Franky- | |
Re: Dateieigenschaften von docx mit dsofile auslesen | | | Autor: Nobbi62 | Datum: 24.04.22 12:52 |
| Ich hab mir das mal angeschaut, bin aber leider nicht der Profi. In der jetzigen Routine sind der fmtid und pid ja die Werte vom Eigenschaftenarray (oder seh ich das falsch). Wie komme ich aber zu den benötigten Übergabewerten für die einzelnen Eigenschaften. Könnte man die nicht beim Durchlaufen des Arrays einmal auslesen oder gibt es da eine allgemeingültige Liste.
Sorry, ich bin glaub ich überfordert. Ich versteh schon nicht, woher SHGetPropertyStoreFormParsingName eigentlich weiß, dass alle Eigenschaften zurückgeben soll. Oder ist dies in der Funktion hardcodiert.
Vielen Dank nochmal und ich freu mich schon auf deine weitere Hilfe. Ein Codebeispiel für das Auslesen der einzelnen ID's der Liste oder ein Codebeispiel für die Werte bei PropertyStore_GetValue_Str(pIPropertyStore, tPROPERTYKEY) wäre ganz klasse.
Viele Grüße
Nobbi | |
Re: Dateieigenschaften von docx mit dsofile auslesen | | | Autor: -Franky- | Datum: 24.04.22 19:11 |
| Hi
Zitat: | | woher SHGetPropertyStoreFormParsingName eigentlich weiß, dass alle Eigenschaften zurückgeben soll | |
Die API erstellt einen PropertyStore (grob übersetzt einen Eigenschaftenspeicher) von der Datei/Ordner/Laufwerk usw. Der Rest ist Hardcodiert wie das Ermitteln der Anzahl vorhandener Eigenschaften die Ausgelesen werden können und erstellt intern ein Array mit den Eigenschaften/PROPERTYKEYS (je nach Flag).
Zitat: | | In der jetzigen Routine sind der fmtid und pid ja die Werte vom Eigenschaftenarray (oder seh ich das falsch) | |
Siehst Du schon richtig. Nur das Du dem PropertyStore ja sagst, gib mir von einem bestimmten Index aus dem Eigenschaftenarray den PROPERTYKEY (PropertyStore_GetAt) und diesen übergibst Du wieder um dann die Werte auszulesen (PropertyStore_GetValue). Wie geschrieben, wenn Du die Werte kennst, brauchst Du diese Schleife nicht und kannst den PROPERTYKEY (fmtid/pid) direkt an PropertyStore_GetValue übergeben. In meinem Code hab ich doch entsprechendes per Debug.Print ausgeben lassen. Inkl. dem CanonicalName. Da gibt es also schon Möglichkeiten zu sagen, wenn die fmtid/pid = xyz ist, oder der CanonicalName = "abc" ist, dann hast Deine gesuchte Eigenschaft, zb den Autor, gefunden und kannst aus der Schleife raus.
Was Du noch machen könntest. Du könntest den PROPERTYKEY, der Dir von PropertyStore_GetAt geliefert wird, per API PSGetNameFromPropertyKey den CanonicalName geben lassen und mit dem dazu ausgelesenen Wert weist Du dann schon was der Autor, die Anzahl der Seiten, Wörter usw ist. Außerdem erkennt man ja auch schon am CanonicalName was dieser machen soll. Das was Du an CanonicalNames benötigst, merkst Dir einfach in irgendeiner Form die Du später wieder verwenden kannst. zb einen String-Array und einer Enum mit Index auf das String-Array fest im Code hinterlegt.
Wenn Du zb. nur den Autor dann auslesen möchtest, nimmst Dir den Index aus der Enum, schaust in das String-Array welcher CanonicalName am Index hinterlegt ist und übergibst diesen an die API PSGetPropertyKeyFromName der Dir dann den PROPERTYKEY liefert und diesen kannst dann wieder an PropertyStore_GetValue übergeben.
So allgemeine Listen für den PROPERTYKEY gibt es schon. Aber die sind so umfangreich und riesig. Mit meiner Methode kannst ja von allen Dateien, Ordner, Laufwerke usw diverse Eigenschaften ausgelesen. Diese Eigenschaften sind dann auch nochmal unterteilt in allgemeine Windows-Eigenschaften, Eigenschaften die zb nur Audio- oder Video-Dateien besitzen, Eigenschaften die zb nur Worddokumente besitzen usw. Da kannst Dir also Vorstellen wie groß diese Listen sind. Diese Findet man auch im Internet. Aber glaub mir, damit möchtest Du nicht arbeiten.
Mit freundlichen Grüßen
-Franky- | |
Re: Dateieigenschaften von docx mit dsofile auslesen | | | Autor: Nobbi62 | Datum: 26.04.22 08:21 |
| ok, dann werd ich mich mal an die Umsetzung machen und aufgrund mehrerer benötigter Werte die Schleife durchlaufen.
Hab schon mal zusammengesucht, was ich alles brauche und dabei ist mir folgendes aufgefallen:
- DateCreated gibt es zweimal (mit unterschiedlichen Werten) und dann gibts auch noch ein ItemDate
- Keywords habe ich nicht gefunden im IPropertyStore
- Version (Word-Version; z.B. 16.0) habe ich nicht gefunden im IPropertyStore
- auch ein paar andere (für mich nicht so wichtige) Daten scheinen im IPropertyStore zu fehlen (z.B. NoteCount)
Ich hab auch ein paar CustomProperties vergeben....könnte ich die auch so auslesen?
Mit der DSOFILE.dll habe ich auch bisher das Icon und ganz früher auch das Thumbnail ausgelesen. Dies scheint mit dem IPropertyStore auch nicht zu funktionieren.
Da muss ich wohl ein paar Kompromisse eingehen.
Trotzdem vielen Dank für die ausführlichen Tipps.
Viele Grüße
Nobbi | |
Re: Dateieigenschaften von docx mit dsofile auslesen | | | Autor: Nobbi62 | Datum: 27.04.22 15:11 |
| Ok, das mit dem DateCreated werde ich heute abend gleich mal testen.
Nachdem es Vor- und Nachteile der verschiedenen Abfragearten gibt, habe ich das Ganze jetzt vorläufig so gelöst:
- Abfrage mit DSOFILE.dll (Dateiname und Icon geht immer)
- scheitert diese Abfrage (bisher z.B. bei Docx....neue Erkenntnisse siehe unten) bzw. sind bestimmte Eigenschaften nicht vorhanden, dann Abfrage mit IPropertyStore
- Und schließlich benutze ich für bestimmte Eigenschaften noch system.application
Damit krieg ich eigentlich alles, was ich so brauche (Thumbnail habe ich allerdings rausgenommen aus allen Abfragen, da dies bei einigen neueren Dateien zu nicht abfangbaren Abstürzen geführt hat)
Vielen Dank wieder für deine vielen Tipps, die mich bisher soweit gebracht haben.
Für alle, die mein ursprüngliches Problem mit der DSOFILE.dll interessiert, hier meine neuesten Erkenntnisse:
Zunächst das Gute: ich habe ja gesagt, dass die Abfrage damit auch schon mit Docx-Dateien funktioniert hat....und das tut sie auch immer noch. Nachdem ich meinen ganzen Code des Projekts danach abgesucht hatte, habe ich zwei Stellen gefunden, an denen es zu keinem Fehler kommt (Doc oder Docx) wie im ersten Post beschrieben. Habe dann zuerst damit gerechnet, dass es sich um überschneidende oder fehlerhafte Deklarationen oder Löschungen handelt.
Einziger Unterschied war aber: Im Fehlercode wurde vor den SummaryProperties ein FramerControl eingefügt, in dem das Dokument angezeigt wird. Dies führt dann dazu, dass der Fehler (aber nur bei Docx) bei SummaryProperties auftritt.
Also das Ganze einfach gedreht und zuerst die Properties abgerufen, dann die SummaryProperties geschlossen und anschließend erst das FramerControl gefüllt......und schon funktionierts wieder mit Doc und Docx....warum auch immer....egal....funktioniert.
Ein kleines Problem noch, der Wert für ByteCount ist bei Docx immer 0, aber daür gibts ja dann z.B. Size im IPropertyStore.
Viele Grüße
Nobbi | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|