vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
Dateieigenschaften 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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-

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Dateieigenschaften von docx mit dsofile auslesen 
Autor: -Franky-
Datum: 10.03.22 16:26

Hi

Zitat:

aber eben nicht solche Daten wie Anzahl Seiten, Wörter und ähnliches.

Liefert Dir mein Code auf jeden Fall.

Mit freundlichen Grüßen
-Franky-

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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-

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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-

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Dateieigenschaften von docx mit dsofile auslesen 
Autor: -Franky-
Datum: 27.04.22 13:42

Hi
Zitat:

DateCreated gibt es zweimal (mit unterschiedlichen Werten) und dann gibts auch noch ein ItemDate

Das liegt daran das der letzte Parameter der Funktion GetProperties -> FullCanonicalName = False ist. Stell den auf True und dann siehst Du, das es unterschiedliche CanonicalNames sind. System.DateCreated und System.Document.DateCreated.
Zitat:

Ich hab auch ein paar CustomProperties vergeben....könnte ich die auch so auslesen?

Hmm, gute Frage. Vllt sind es ja die [Unknown CanonicalName] wo es keinen CanonicalName für gibt. Da müsste man sich tatsächlich die fmtid und pid irgendwie merken.
Zitat:

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.

Das könnte die System.ThumbnailCacheId sein. Da müsste man mal schauen wie man von der ausgelesene ID wieder an das Bild (Icon oder Thumbnail) kommt. Ansonsten gibt es ja noch andere Möglichkeiten an das Icon zu kommen.

Mit freundlichen Grüßen
-Franky-

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel