Поделиться через


Автономная реализация IPropertyStorage

Предоставляемая системой автономная реализация IPropertySetStorage включает реализацию IPropertyStorage, интерфейса, который считывает и записывает свойства в хранилище наборов свойств. Интерфейс IPropertySetStorage создает и открывает наборы свойств в хранилище. Интерфейсы IEnumSTATPROPSTG и IEnumSTATPROPSETSTG также предоставляются в изолированной реализации.

Чтобы получить указатель на автономную реализацию IPropertyStorage, вызовите функцию StgCreatePropStg , чтобы создать новый набор свойств, или StgOpenPropStg для получения указателя интерфейса на существующий набор свойств (или вызовите методы Create или Open изолированной реализации IPropertySetStorage ).

Автономная реализация IPropertyStorage создает наборы свойств для любого объекта хранилища или потока, а не только в составных хранилищах файлов и потоках. Автономная реализация не зависит от составных файлов и может использоваться с любой реализацией структурированных хранилищ. Дополнительные сведения о реализации составного файла этого интерфейса см. в разделе Реализация составного файла IPropertyStorage-Compound File.

Назначение

Используйте IPropertyStorage для управления свойствами в одном наборе свойств. Его методы поддерживают чтение, запись и удаление свойств и необязательных строковых имен, которые могут быть связаны с идентификаторами свойств. Другие методы поддерживают стандартные операции фиксации и отменить изменения хранилища. Существует также метод, который задает время, связанное с хранилищем свойств, и другой метод, позволяющий использовать назначение ИДЕНТИФИКАТОРа CLSID для связывания другого кода, например кода пользовательского интерфейса, с набором свойств. Метод Enum предоставляет указатель на автономную реализацию IEnumSTATPROPSTG, которая перечисляет свойства в наборе.

Форматы наборов свойств версий 0 и 1

Автономная реализация IPropertyStorage поддерживает форматы сериализации наборов свойств версии 0 и версии 1. Дополнительные сведения см. в разделе Сериализация набора свойств. Наборы свойств создаются в формате версии 0 и остаются в этом формате, если не запрашиваются новые функции. В это время формат обновляется до версии 1.

Например, если набор свойств создается с флагом PROPSETFLAG_DEFAULT, его формат — версия 0. Если типы свойств, соответствующие формату версии 0, записываются в этот набор свойств и считываются из них, набор свойств остается в формате версии 0. Если тип свойства версии 1 записывается в набор свойств, набор свойств автоматически обновляется до версии 1. Впоследствии этот набор свойств больше не может быть прочитан реализациями, которые понимают только версию 0.

Типы IPropertyStorage и Variant

Автономная реализация IPropertyStorage не поддерживает типы вариантов VT_UNKNOWN или VT_DISPATCH в элементе vt структуры PROPVARIANT .

В SafeArray поддерживаются следующие типы вариантов. то есть эти значения можно объединить с VT_ARRAY в элементе vt структуры PROPVARIANT .

Типы variant, поддерживаемые в SafeArray реализацией составного файла IPropertyStorage

VT_I1

VT_UI1

VT_I2

VT_UI2

VT_I4

VT_UI4

VT_INT

VT_UINT

VT_R4

VT_R8

VT_CY

VT_DATE

VT_BSTR

VT_BOOL.

VT_DECIMAL

VT_ERROR

VT_VARIANT

 

 

При объединении VT_VARIANT с VT_ARRAY сам SafeArray содержит структуры PROPVARIANT . Однако типы этих элементов должны быть взяты из предыдущего списка, не могут быть VT_VARIANT и не могут содержать индикаторы VT_VECTOR, VT_ARRAY или VT_BYREF.

Методы IPropertyStorage

Автономная реализация IPropertyStorage поддерживает следующие методы:

IPropertyStorage::ReadMultiple

Считывает свойства, указанные в массиве rgpspec , и предоставляет значения всех допустимых свойств в массиве rgvar элементов PROPVARIANT .

В системной автономной реализации повторяющиеся идентификаторы свойств, ссылающиеся на типы потоков или хранилищ, приводят к нескольким вызовам IStorage::OpenStream или IStorage::OpenStorage::OpenStorage , а успех или сбой ReadMultiple зависит от способности базовой реализации хранилища совместно использовать открытые хранилища.

Кроме того, чтобы обеспечить потокобезопасную операцию, если одно и то же свойство с значением потока или хранилища запрашивается несколько раз с помощью одного указателя IPropertyStorage , открытие будет выполнено успешно или завершится сбоем в зависимости от того, открыто ли свойство уже, а также от того, обрабатывает ли базовая файловая система несколько операций открытия потока или хранилища. Таким образом, операция ReadMultiple для свойства со значением потока или хранилища всегда приводит к вызову IStorage::OpenStream или IStorage::OpenStorage, передавая доступ (например, STGM_READWRITE) и общие значения (например, STGM_SHARE_EXCLUSIVE), указанные при первоначальном открытии или создании набора свойств.

Если метод завершается сбоем, значения, записанные в rgvar[], не определены. Если некоторые свойства, возвращаемые потоком или хранилищем, успешно открыты, но до завершения выполнения возникает ошибка, эти свойства должны быть освобождены до возврата метода.

IPropertyStorage::WriteMultiple

Записывает свойства, указанные в массиве rgpspec[], присваивая им теги PROPVARIANT и значения, указанные в rgvar[]. Уже существующим свойствам присваиваются указанные значения PROPVARIANT , а свойства, которые в настоящее время не существуют, создаются.

IPropertyStorage::D eleteMultiple

Удаляет свойства, указанные в rgpspec[].

IPropertyStorage::ReadPropertyNames

Считывает существующие строковые имена, связанные с идентификаторами свойств, указанными в массиве rgpropid[].

IPropertyStorage::WritePropertyNames

Присваивает имена строк, указанные в массиве rglpwstrName идентификаторам свойств, указанным в массиве rgpropid .

IPropertyStorage::D eletePropertyNames

Удаляет строковые имена идентификаторов свойств, указанных в массиве rgpropid , записывая в имя свойства значение NULL .

IPropertyStorage::SetClass

Задает ИДЕНТИФИКАТОР CLSID потока набора свойств. В автономной реализации установка CLSID в неимпляющем наборе свойств (который может содержать свойства с значением хранилища или потока, как описано в разделе IPropertySetStorage::Create) также задает CLSID в базовом подtorage, чтобы его можно было получить с помощью вызова IStorage::Stat.

IPropertyStorage::Commit

Для простых и неимпляционных наборов свойств выполняет очистку образа памяти в дисковой подсистеме. Кроме того, для неимплированных наборов свойств в режиме транзакций этот метод вызывает метод IStorage::Commit в наборе свойств.

IPropertyStorage::Revert

Только для неимплейных наборов свойств вызывает метод Revert базового хранилища и повторно открывает поток "содержимое". Для простых наборов свойств возвращает только E_OK.

IPropertyStorage::Enum

Создает объект перечислителя, реализующий IEnumSTATPROPSTG, методы которого могут вызываться для перечисления структур STATPROPSTG , предоставляющих сведения о каждом из свойств в наборе.

Эта реализация создает массив, в который считывается весь набор свойств и который можно совместно использовать при вызове метода IEnumSTATPROPSTG::Clone .

IPropertyStorage::Stat

Заполняет элементы структуры STATPROPSETSTG , которая содержит сведения о наборе свойств в целом. При возврате передает указатель на структуру.

Для неимплейных наборов хранилищ эта реализация вызывает IStorage::Stat (или IStream::Stat) для получения сведений из базового хранилища или потока.

IPropertyStorage::SetTimes

Только для неимплейных наборов свойств задает время, поддерживаемое базовым хранилищем. Эта реализация SetTimes вызывает метод IStorage::SetElementTimes базового хранилища для изменения времени. Он поддерживает время, поддерживаеме базовым методом, которое может быть временем изменения, временем доступа или временем создания.

Автономная реализация IPropertySetStorage

IPropertyStorage

IStorage::SetElementTimes

StgOpenPropStg

StgCreatePropStg

StgCreatePropSetStg