Announcement

Collapse
No announcement yet.

unterschiedliche DocSummary-Versionen ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • unterschiedliche DocSummary-Versionen ?

    Hallo, ich habe einen merkwürdigen Effekt beim Setzen von Document Properties festgestellt. Wenn ich eine eigene Datei erzeuge, den DocSummary-Stream anlege, klappt daß setzen von (String)-Properties nur wie folgt:
    <pre>
    FillChar (Prop, SizeOf (TPropVariant), #0);
    Prop.vt := VT_LPWSTR; (müßte eigentlich VT_LPSTR sein, geht aber nur so!)
    Prop.pszVal := PChar (Value);
    FPropertyStorage.WriteMultiple (1, FPSpec, @Prop, PID_FIRST_USABLE)
    </pre>

    Öffne ich dagegen z.B. eine Word-Datei, klappt das Setzen nur so:

    <pre>
    FillChar (Prop, SizeOf (TPropVariant), #0);
    Prop.vt := VT_LPSTR;
    GetMem (Prop.pszVal, Length (Value)+1);
    StrPCopy (Prop.pszVal, Value);
    FPropertyStorage.WriteMultiple (1, FPSpec, @Prop, PID_FIRST_USABLE)
    FreeMem (Prop.pszVal, Length (Value)+1);
    </pre>

    Kann es sein, daß es unterschiedliche Versionen des DocSummary-Strings gibt? Value ist in beiden Fällen ein WideString. Mit der 2. Variante klappt es bei eigenen Dateien nicht, und mit der 1. bei Office-Dateien nicht. Außerdem kann ich problemlos bei Office-Dateien die Properties HeadingPairs und TitlesOfParts lesen und schreiben, bei eigenen Dateien klappt es aber nicht, obwohl die Routine fehlerfrei durchläuft.

    Danke
    Matze

  • #2
    Hallo,

    ich greife seit einiger Zeit nur noch über das von Microsoft zur Verfügung gestellte <b>DSOFile-Objekt</b> auf diese Daten zu. Ich kann also nicht sagen, ob es in der Zwischenzeit interne Strukturänderungen gegeben hat. Da DSOFile frei verfügbar ist und mit der eigenen Anwendung weitergegeben werden darf, gibt es auch keinen Grund mehr für eigene Bemühungen ;-)

    Das folgende Beisiel stammt aus meinem Buch <i>COM/DCOM/COM+ mit Delphi</i>):
    <pre>
    uses DSOleFile_TLB;

    procedure TForm1.SpeedButtonOpenClick(Sender: TObject);
    begin
    if OpenDialogDoc.Execute then
    begin
    StaticTextDocName.Caption := OpenDialogDoc.FileName;
    ReadDocProperties(OpenDialogDoc.FileName);
    end;
    end;

    procedure TForm1.ReadDocProperties(sDocName: String);
    var
    aSrv : _PropertyReader;
    aProp : DocumentProperties;
    begin
    aSrv := CoPropertyReader.Create;
    aProp := aSrv.GetDocumentProperties(StaticTextDocName.Capti on);
    with Memo1.Lines do
    begin
    Add('Autor: ' + aProp.Author);
    Add('Stichwörter: ' + aProp.Keywords);
    Add('Kategorie: ' + aProp.Category);
    Add('Kommentar: ' + aProp.Comments);
    end;
    aSrv := nil;
    end;
    </pre>
    Der In-Process-Server DSOFile kann über die Web-Seiten von Microsoft heruntergeladen werden (Article ID Q224351 "FILE: DSOFILE.EXE Lets You Read Document Properties Without Office Installed")

    Comment


    • #3
      Hallo,

      jetzt wird die Sache langsam lustig. Ich schreibe die Properties in etwa wie folgt:

      <pre>
      FileName := 'c:\temp\ausgabe.b44';
      OleCheck (StgCreateDocFile (PWideChar (FileName), STGM_CREATE or STGM_READWRITE or STGM_DIRECT or STGM_SHARE_EXCLUSIVE, 0, FRoot));
      FPropSet := FRoot as IPropertySetStorage;
      OleCheck (FPropSet.Create (FMTID_SummaryInformation, FMTID_SummaryInformation, 0,
      STGM_CREATE or STGM_READWRITE or STGM_DIRECT or STGM_SHARE_EXCLUSIVE, FSummary));
      FillChar (Spec, SizeOf (TPropSpec), #0);
      Spec.ulKind := PRSPEC_PROPID;
      Spec.propid := PIDSI_TITLE;
      FillChar (Prop, SizeOf (TPropVariant), #0);
      Prop.vt := VT_LPSTR;
      Txt := CoTaskMemAlloc (255);
      StrCopy (Txt, 'Titel1');
      Prop.pszVal := Txt;
      OleCheck (FSummary.WriteMultiple (1, @Spec, @Prop, PID_FIRST_USABLE));
      CoTaskMemFree (Txt);
      </pre>

      Wenn ich durch rechtsklick auf die Datei mir die Eigenschaften anzeigen lassen will, wird nichts angezeigt. Lese ich jetzt (zB. mit DSOFile) den Titel aus, ist er vorhanden, d.h. er steht im Stream.

      Das gleiche gilt für DSOFile, bei vorhandenen Office-Dateien kann ich die Properties lesen und schreiben, bei eigenen klappt es, sie werden aber nicht angezeigt !!???!!

      Es ist offenbar ein Anzeigeproblem (NT 4.0 + SP 5), oder ich mache was beim Erzeugen der Datei oder des Summary-Streams was falsch!?

      Nebenbei kann ich mit DSOFile auch nicht HeadingPairs und TitleOfParts setzen.

      Matz

      Comment


      • #4
        Hallo,

        wenn diese Dokumenteigenschaften auch im Eigenschaftsdialog des Windows-Explorers vorhanden sein sollen und man auch eigene Einträge definieren und verwenden will, greife ich auf den Weg zurück, den ich in meinem Buch <i>COM/DCOM/COM+ mit Delphi</i> im Kapitel 11 beschrieben habe. Das Beispielprojekt ist auf der CDROM im Verzeichnis <i>Kapitel 11\RedSys</i> zu finden.

        Für das Aulesen von bereits vorhandenen Einträgen (Microsoft Office-Dokumente) nehme ich nur noch DSOFile. Allerdings greife ich in der Regel nur auf die Standard-Informationen zu, einen anderen Weg musste ich hier noch nicht suchen

        Comment

        Working...
        X