Speichern von Eigenschaftensätzen

Anwendungen können einige der Zustandsdaten ihrer Dokumente verfügbar machen, damit andere Anwendungen diese Daten suchen und lesen können. Einige Beispiele sind ein Eigenschaftensatz, der den Autor, den Titel und die Schlüsselwörter eines Dokuments beschreibt, das mit einem Textverarbeitungsprogramm erstellt wurde, oder die Liste der schriftarten, die in einem Dokument verwendet werden. Diese Möglichkeit ist nicht auf Dokumente beschränkt; Sie kann auch für eingebettete Objekte verwendet werden. Im Allgemeinen sollte der Zugriff auf Eigenschaftensätze über die Schnittstellen IPropertySetStorage und IPropertyStorage erfolgen. In diesem Abschnitt wird jedoch die zuvor empfohlene Vorgehensweise beschrieben.

Hinweis

Wenn Sie einen Eigenschaftensatz speichern, der für Ihre Anwendung intern ist, sollten Sie die folgenden Richtlinien möglicherweise nicht verwenden. Befolgen Sie diese Richtlinien, um Ihren Eigenschaftssatz für andere Anwendungen verfügbar zu machen.

 

So speichern Sie einen Eigenschaftensatz in einer zusammengesetzten Datei

  1. Erstellen Sie eine IStorage- oder IStream-instance auf derselben Ebene der Speicherstruktur wie die Datenströme. Folgen Sie dem Namen Ihres IStorage- oder IStream-instance mit "\005". Stream- und Speichernamen, die mit 0x05 beginnen, sind für allgemeine Eigenschaftssätze reserviert, die von Anwendungen gemeinsam verwendet werden können. Außerdem sind Datenströme, die mit diesem Wert beginnen, auf 256 KB beschränkt. Die Namen können entweder aus veröffentlichten Namen und Formaten ausgewählt werden, oder durch Zuweisen einer FMTID-Eigenschaft und Ableitung des Namens vom FMTID gemäß den unter Benennungskonventionen für Speicherobjekte beschriebenen Konventionen.
  2. Ein Eigenschaftssatz kann in einem einzelnen IStream-instance oder in einem IStorage-instance gespeichert werden, das mehrere Streams und Speicher enthält. Im Fall einer IStorage-instance ist der enthaltene Stream mit dem Namen Contents der primäre Datenstrom, der Eigenschaftswerte enthält, wobei einige Werte Namen anderer Datenströme oder Speicherinstanzen innerhalb des Speichers für diesen Eigenschaftssatz sein können.
  3. Geben Sie die CLSID der Objektklasse an, die die Eigenschaftswerte anzeigen oder programmgesteuerten Zugriff auf diese bereitstellen kann. Wenn keine solche Klasse vorhanden ist, sollte die CLSID auf den Formatbezeichner des Eigenschaftensatzes festgelegt werden. Legen Sie für einen Eigenschaftensatz, der eine IStorage-instance verwendet, entweder die CLSID des IStorage-instance auf die gleiche wie im Inhaltsdatenstrom gespeicherte fest, oder auf CLSID_NULL; der Wert in einem neu erstellten IStorage-instance.
  4. Sie haben die Möglichkeit, anzeigebare Namen anzugeben, die den Inhalt des Wörterbuchs bilden.

Einige Anwendungen können nur Implementierungen von Eigenschaftssätzen lesen, die als IStream-Instanzen gespeichert sind. Anwendungen sollten so geschrieben werden, dass ein Eigenschaftssatz entweder in einem IStorage- oder IStream-instance gespeichert werden kann, es sei denn, die Definition des Eigenschaftensatzes gibt etwas anderes an. Beispielsweise gibt die Definition des Eigenschaftensatzes Zusammenfassungsinformationen an, dass sie nur in einem benannten IStream-instance gespeichert werden kann. In Fällen, in denen Sie nach einem Eigenschaftensatz suchen und nicht wissen, ob es sich um einen Speicher oder Einen Stream handelt, suchen Sie nach einem IStream-instance mit dem Namen Des Eigenschaftensatzes zuerst. Wenn dies fehlschlägt, suchen Sie nach einem IStorage-instance.

Angenommen, es gibt eine Klasse von Anwendungen, die Informationen zu Tieren bearbeiten, um das Speichern von Eigenschaftssätzen in einer IStorage-Implementierung besser zu verstehen. Zunächst wird eine CLSID (CLSID_AnimalApp) für diese Gruppe von Anwendungen definiert, sodass sie angeben können, dass sie Eigenschaftensätze verstehen, die Tierinformationen (FMTID_AnimalInfo) enthalten, und andere, die medizinische Informationen (FMTID_MedicalInfo) enthalten.

IStorage (File): "C:\OLE\REVO.DOC" 
  IStorage: "\005AnimalInfo", CLSID = CLSID_AnimalApp 
    IStream: "Contents" 
      WORD wByteOrder, WORD wFmtVersion, DWORD dwOSVer, 
      CLSID CLSID_AnimalApp, DWORD cSections... 
      ... 
      FMTID = FMTID_AnimalInfo 
      Property: Type = PID_ANIMALTYPE, Type = VT_LPWSTR, 
              Value = L"Dog" 
      Property: Type = PID_ANIMALNAME, Type = VT_LPWSTR, 
              Value = L"Revo" 
      Property: Type = PID_MEDICALHISTORY, Type = VT_STREAMED_OBJECT, 
              Value = "MedicalInfo" 
      ... 
    IStream: "MedicalInfo" 
      WORD wByteOrder, WORD wFmtVersion, DWORD dwOSVer, 
      CLSID CLSID_AnimalApp, DWORD cSections... 
      ... 
      FMTID = CLSID_MedicalInfo 
      Property: Type = PID_VETNAME, Type = VT_LPWSTR, 
              Value = L"Dr. Woof" 
      Property: Type = PID_LASTEXAM, Type = VT_DATE, Value = ...

Beachten Sie, dass die CLSID der IStorage-Schnittstelle und beider Eigenschaftensätze CLSID_AnimalApp ist. Dadurch werden alle Anwendungen identifiziert, die programmgesteuerten Zugriff auf diese Eigenschaftensätze anzeigen und/oder bereitstellen können. Jede Anwendung kann die Daten innerhalb der Eigenschaftssätze (den Punkt hinter Eigenschaftensätzen) lesen, aber nur Anwendungen, die mit dem Klassenbezeichner von CLSID_AnimalApp identifiziert werden, können die Bedeutung der Daten in den Eigenschaftensätzen verstehen.