Benutzer mit den meisten Antworten
VC++ 6.0: Verbunddateien: Die Verbunddatei wurde mit einer inkompatiblen Version erzeugt

Frage
-
Hallo Forum
Da hab ich mir schon die Mühe gemacht, über Verbunddateien Informationen zu sammeln und dann festgestellt, dass es hierzu glücklicherweise eine API gibt. Nun versuche ich also in meiner kindlichen Naivität eine MSG Datei von Microsoft Outlook mit StgOpenStorage zu öffnen, und scheitere dann leider an
InlineIsEqualGUID
und zwar sagt er mir, dass die Versionen wohl nicht kompatibel sind.
Nun frage ich mich aber, woher ich überhaupt eine Version beziehe, weil all dies - meiner bescheidenen Meinung nach - ja Windows Internals sind, und auf einer Maschine hoffentlich gleich sind.
Welche Library oder DLL könnte hier nicht passen, dass mein selbst compiliertes Programm (das ja eigentlich ein Beispielprogramm von http://www.endurasoft.com/vcd/ststo.htm ist) offenbar nicht mit dem MSG Format von Outlook 2003 kann...oder ist etwa das Outlook zu alt?
Grüße
FireHeart
PS: Ich hoffe ja wohl nicht, dass meine kleine Programmabänderung von
if (!::InlineIsEqualGUID(...)) throw ...
welche sich gar nicht compilieren ließ, auf
if (!::ATL::InlineIsEqualGUID(...)) throw ...
Schuld daran trägt.
Antworten
-
Ich versthe überhaupt nicht was Du vorhast.
Das Programm FileWriter erzeugt und liest nur Dateien mit der Versions (storage GUID)
GUID_VCDFileFormat10 = {C3727EAF-D541-11d1-B1AA-00A045BFDB8F}
Und eben keine andere Version.
Das ist wie ein Header der vorhanden sein muss, damit Du weißt ob die Datei wirklich von dem Typ ist, den Du erwartest.
Eine MSG Datei hat bei mir eben dir Stg GUID {00020D0B-0000-0000-C000-000000000046}.Logisch, dass dies nicht passt. Das ist wie wenn man ein bestimmtes Verzeichnis an einer bestimmten Stelle im Dateisystem erwartet... Du hast hier ein "Dateiosystem" das Du nicht kennst und eben enumerieren willst. Alle Funktionen sind doch da um das zu tun...
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Robert BreitenhoferModerator Montag, 7. November 2011 12:08
Alle Antworten
-
GUIDs kann man direkt vergleichen mit ==, wenn Du C++ programmierst!
Was bitte willst Du mit einer MSG Datei direkt?
Warum benutzt Du nicht das Automationsinterface von Outlook um solch eine Datei zu bearbeiten oder zu lesen?
PS: Was bitte ist eine Verbund Datei?
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Bearbeitet Martin RichterModerator Dienstag, 11. Oktober 2011 09:37
-
Hallo Martin
Mein Problem ist nicht, dass ich mit dem InlineEqualGUID Probleme hätte, sondern dass er leider recht hat mit seinem Rückgabewert....d.h. die Versionen sind tatsächlich nicht kompatibel. Ich bekomme ein paar wenige brauchbare Daten und der Rest ist Müll. Ich frage mich daher, wie ich es schaffe, in mein Programm die gleiche API-Version reinzucompilieren (das sind ja API Aufrufe, ich hab das selber ja gar nicht in der Hand), als wie Outlook 2003 seine MSG Dateien schreibt.
Die Gründe, warum ich das Automationsinterface von Outlook nicht nützen (wollte) sind vielfältig:
- Ich war der Meinung, der Ansatz mit dem direkten Auslesen der MSG Datei als CompoundFile wäre relativ einfach
- Ich möchte die Dateien unabhängig von einer vorhandenen/nicht vorhandenen Outlook Installation lesen können
- Ich wusste nicht, dass es ein Automationsinterface gibt und wie das nun wieder funktioniert
PS: Ich kannte das "Verbunddatei Format" bis vor wenigen Stunden auch nicht. Ein kurzer Blick in die Dokumente macht aber sehr schnell klar, dass man auf diese Dateien nur über API Zugriffe zugreifen kann, weil sie furchtbar komplex sind.(http://en.wikipedia.org/wiki/Compound_File_Binary_Format)
PPS: Eigentlich wollte ich ja nur aus einer Outlook MSG Datei das Sendedatum, den Absender und den Betreff auslesen.... kennt ihr da irgendein fertiges Bespiel in C++?
Grüße
FireHeart
-
Naja. Das Compound File System ist schon simpel. Das Problem ist dennoch, dass jeder Stream beinhalten kann, was der Programmierer will... d.h. dass muss weder strukturiert noch groß dokumentiert sein...
Aber was nützt es Dir? MSG Dateien existieren "selten" außerhalb von Outlook...
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Bearbeitet Martin RichterModerator Dienstag, 11. Oktober 2011 15:52
-
Hallo Martin
Wie kommt es aber dennoch, dass die Compound File Versionen nicht gleich sind. Ich nehme doch an, dass auch Outlook auf die gleichen Betriebssystem-API Funktionen zum Erstellen dieser Compound-Files greift wie mein Programm das tut.
Interessanterweise ist bei diesem Beispielprogramm (http://www.endurasoft.com/downloads/ststo.zip) aber auch das fertige Tool "DFView.exe" dabei...und der zeigt meine Outlook MSG Dateien korrekt an.
Zudem ist liegt das Beispielprogramm auch in compilierter Form vor und dieses scheitert genauso an der Versionsungleichheit, als wenn ich es selbst compiliere.
Grüße
FireHeart
-
Ich versthe überhaupt nicht was Du vorhast.
Das Programm FileWriter erzeugt und liest nur Dateien mit der Versions (storage GUID)
GUID_VCDFileFormat10 = {C3727EAF-D541-11d1-B1AA-00A045BFDB8F}
Und eben keine andere Version.
Das ist wie ein Header der vorhanden sein muss, damit Du weißt ob die Datei wirklich von dem Typ ist, den Du erwartest.
Eine MSG Datei hat bei mir eben dir Stg GUID {00020D0B-0000-0000-C000-000000000046}.Logisch, dass dies nicht passt. Das ist wie wenn man ein bestimmtes Verzeichnis an einer bestimmten Stelle im Dateisystem erwartet... Du hast hier ein "Dateiosystem" das Du nicht kennst und eben enumerieren willst. Alle Funktionen sind doch da um das zu tun...
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Robert BreitenhoferModerator Montag, 7. November 2011 12:08
-
Hallo Martin
Jaja, da hätte ich mir den Code etwas genauer ansehen sollen. Der Vergleich geht ja nur auf seine VCDFileFormat GUID.
Tja, somit verschiebt sich mein Problem zu dem Punkt, wo es darum geht etwas auszulesen. Offenbar sucht/liest das Testprogramm andere substrings als sie in einer Message vorkommen....
Ich werd mich da morgen reintigern....
Danke erstmal
FireHeart
-
Hallo Fire-Heart,
Habe noch ein paar interessante Links gefunden. Wie hast Du es weiter gemacht?
How To Read Compound Document Properties Directly with VC++
INFO: Save Message to MSG Compound File
StgOpenStorage “STG_E_OLDFORMAT à Indicates the storage object being opened was created by the Beta 1 storage provider. This format is no longer supported.”
Grüße,
Robert