Хранение наборов свойств

Приложения могут предоставлять некоторые данные о состоянии своих документов, чтобы другие приложения могли находить и считывать эти данные. Некоторые примеры — набор свойств, описывающий автора, название и ключевые слова документа, созданного с помощью текстового процессора, или список шрифтов, используемых в документе. Это средство не ограничивается документами; Его также можно использовать во внедренных объектах. Как правило, доступ к наборам свойств должен осуществляться через интерфейсы IPropertySetStorage и IPropertyStorage , но в этом разделе описан ранее рекомендуемый способ.

Примечание

При хранении набора свойств, который является внутренним для приложения, вы можете не использовать следующие рекомендации. Чтобы предоставить набор свойств другим приложениям, следуйте этим рекомендациям.

 

Хранение набора свойств в составном файле

  1. Создайте экземпляр IStorage или IStream на том же уровне структуры хранилища, что и его потоки данных. Следуйте имени экземпляра IStorage или IStream с помощью "\005". Имена потоков и хранилищ, начинающиеся с 0x05, зарезервированы для общих наборов свойств, которые могут совместно использоваться приложениями. Кроме того, потоки, начинающиеся с этого значения, ограничены 256 КБ. Имена можно выбрать из опубликованных имен и форматов или путем присвоения свойству значения FMTID и получения имени от FMTID в соответствии с соглашениями, описанными в разделе Соглашения об именовании объектов хранилища.
  2. Набор свойств может храниться в одном экземпляре IStream или в экземпляре IStorage , содержащем несколько потоков и хранилищ. В случае экземпляра IStorage автономный поток с именем Contents является основным потоком, содержащим значения свойств, где некоторые значения могут быть именами других потоков или экземпляров хранилища в хранилище для этого набора свойств.
  3. Укажите CLSID класса объекта, который может отображать значения свойств или предоставлять программный доступ к этим значениям. Если такого класса нет, clSID должен иметь идентификатор формата набора свойств. Для набора свойств, использующего экземпляр IStorage , задайте значение CLSID экземпляра IStorage таким же, как хранящийся в потоке содержимого, или CLSID_NULL; значение во вновь созданном экземпляре IStorage .
  4. Вы можете указать отображаемые имена, которые формируют содержимое словаря.

Некоторые приложения могут считывать только реализации наборов свойств, хранящихся в виде экземпляров IStream . Приложения должны быть написаны так, чтобы набор свойств мог храниться в экземпляре IStorage или IStream , если в определении набора свойств не указано иное. Например, определение набора свойств Summary Information указывает, что он может храниться только в именованном экземпляре IStream . В случаях, когда вы ищете набор свойств и не знаете, является ли это хранилищем или потоком, найдите экземпляр IStream с именем набора свойств. В случае сбоя найдите экземпляр IStorage .

Чтобы лучше понять хранение наборов свойств в реализации IStorage , предположим, что существует класс приложений, которые редактируют сведения о животных. Во-первых, для этого набора приложений определен CLSID (CLSID_AnimalApp), чтобы они могли указать, что они понимают наборы свойств, содержащие сведения о животных (FMTID_AnimalInfo), и другие, содержащие медицинскую информацию (FMTID_MedicalInfo).

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 = ...

Имейте в виду, что ИДЕНТИФИКАТОР CLSID интерфейса IStorage и обоих наборов свойств CLSID_AnimalApp. Это идентифицирует любое приложение, которое может отображать и (или) предоставлять программный доступ к этим наборам свойств. Любое приложение может считывать данные в наборах свойств (точки позади наборов свойств), но только приложения, идентифицируемые идентификатором класса CLSID_AnimalApp могут понять значение данных в наборах свойств.