Рекомендации и вопросы и ответы по обработчику свойств

В этом разделе объясняется, как создавать и регистрировать обработчики свойств для работы с системой свойств Windows.

Эта тема организована следующим образом:

Рекомендации

Переопределение свойств файловой системы

Некоторые свойства файлов предоставляются источником данных файловой системы, например:

  • PKEY_FileName
  • PKEY_Extension
  • PKEY_ModifiedTime

Как правило, обработчики свойств не могут предоставлять значения для этих свойств. Однако в некоторых случаях эти свойства можно переопределить на основе сведений о регистрации, предоставленных обработчиком свойств. Обработчики свойств заполняют HKEY_CLASSES_ROOT\CLSID\{handler clsid}\OverrideFileSystemProperties именами свойств, которые нужно переопределить. Это ограничивается фиксированным набором свойств, показанных в следующем списке, о которых у системы есть знания.

Переопределение поддерживается для следующих значений свойств:

Полный список всех свойств оболочки см. в разделе Свойства оболочки.

Важно!

Переопределенные значения свойств используются только при индексировании файлов. Таким образом, просмотр файлов из источника данных файловой системы не приводит к переопределенным значениям.  

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

Существует два основных варианта хранения свойств в форматах xml-файлов:

  • Храните каждое свойство с помощью XML-элементов и атрибутов в соответствии со схемой XML документа. Этот подход является более понятным для XML.
  • Сериализуйте все хранилище свойств в большой двоичный объект (BLOB) памяти, преобразуйте большой двоичный объект в строку в кодировке Base64 и сохраните ее в XML-коде. Это более простой из двух подходов, и его можно использовать для тривиально обеспечить поддержку открытых метаданных.

Некоторые обработчики могут сочетать эти подходы, сохраняя некоторые важные значения в стандартном формате XML, а остальные — в большом двоичном объекте.

Вычисляемые свойства

Некоторые свойства являются производными от определенных атрибутов файла. Например, свойство System.Image.Dimensions определяется фактическими размерами изображения в файле изображения. Так как такие значения свойств не могут быть изменены обработчиком свойств, они, таким образом, помечаются isInnate="true" в описании свойства. Другие свойства вычисляются из части определенного свойства или путем агрегирования значений нескольких свойств. Так как обновления этих "вычисляемых" свойств создают неоднозначность в том, как должны быть изменены "исходные" значения, вычисляемые свойства должны быть помечены isInnate="true" в описании свойства или сообщаться как доступные только для чтения. Последний параметр доступен путем указания обработчику возвращать S_FALSE из IPropertyStoreCapabilities::IsPropertyWritable.

Вопросы и ответы

Почему индексатор Windows Search не загружает обработчик свойств?

Индексатор Windows Search работает как системная служба и не может загружать библиотеки DLL, хранящиеся в каталоге профиля пользователя. При сборке и отладке с помощью Microsoft Visual Studio библиотека DLL будет размещена в профиле пользователя (и поэтому она не будет загружена индексатором). Чтобы обойти эту проблему, скопируйте библиотеку DLL за пределы папки профиля (например, в папку C:\Program Files\YourAppName) и зарегистрируйте ее там.

Более конкретные рекомендации по разработке обработчиков свойств для работы с индексатором Windows Search см. в разделе Разработка обработчиков свойств для Поиска Windows.

Какие свойства следует обнаруживать с помощью методов перечисления IPropertyStore::GetCount и IPropertyStore::GetAt?

Не все клиенты объектов хранилища свойств используют эти методы. Некоторые клиенты знают о свойствах, которые они планируют запрашивать напрямую (по имени PKEY), или получают сведения о свойствах через список описания свойств. Методы обнаружения свойств поддерживают несколько других сценариев. Если свойству не нужно участвовать в этих сценариях, его не нужно перечислять. Таким образом, обработчик свойств может создать не VT_EMPTY значение для свойств, которые не обнаружены с помощью методов IPropertyStore::GetCount и IPropertyStore::GetAt .

Однако свойства должны быть видны с помощью этих методов при выполнении любого из следующих условий:

  • Если свойство проиндексировано таким образом, чтобы оно было доступно для поиска: Это означает, что он включен в хранилище свойств Windows Search (обозначается isColumn = "true" в схеме описания свойства) или доступен для полнотекстового поиска (inInvertedIndex = "true"). В случае отсутствия этих флагов или описания свойства свойства типа string будут автоматически добавлены в инвертированные индексы для включения поиска. Поскольку список известных свойств (с установленными описаниями свойств) в системе свойств очень велик (более 800 свойств), было бы нецелесообразно запрашивать каждый обработчик свойств для каждого свойства, зарегистрированного в системе свойств. Вместо этого процесс индексирования перечисляет соответствующие свойства из обработчика свойств для каждого индексированного элемента и использует значения перечисленных свойств для построения полнотекстового индекса.
  • Если свойство должно быть скопировано при дублировании набора свойств элемента: Для реализации функции "копирование набора свойств" исходный элемент делает свойства, которые должны быть скопированы, видимыми с помощью методов IPropertyStore::GetCount и IPropertyStore::GetAt . Не следует включать свойства, которые не нужно копировать или не имеет смысла копировать.
  • Если значение свойства не является пустым (VT_EMPTY): Пустые значения свойств не являются полезными для клиентов. Когда клиенты пытаются вернуть пустые значения свойств, возвращается значение VT_EMPTY. Таким образом, не следует перечислять свойства с пустыми значениями.
  • Если свойство должно быть удалено при вызове функции remove properties, выполните следующие действия: Эта функция существует для защиты конфиденциальности; Он обнаруживает все значения из обработчика свойств с помощью перечисления и удаляет каждое из них, выбранное для удаления пользователем.

Примечание

Перечисление свойств не передает набор свойств, поддерживаемых определенным обработчиком свойств, если обработчик поддерживает фиксированную схему (а не открытые метаданные). Вместо этого такие обработчики должны документировать набор поддерживаемых ими свойств.

 

Разделы справки узнать, какие форматы файлов поддерживают открытые метаданные?

Сведения о поддержке открытых метаданных см. в разделе "Типы файлов, поддерживающие открытые метаданные" статьи Типы файлов.

Можно ли хранить VT_NULL значения с помощью обработчика свойств?

Нет. VT_NULL значения будут преобразованы в VT_EMPTY при вызовах IPropertyStore::GetValue и IPropertyStore::SetValue.

Какие форматы строк даты поддерживаются функцией PropVariantChangeType?

Как правило, свойства, представляющие значения даты и времени, следует представлять с помощью VT_FILETIME. Однако многие источники данных предоставляют эти сведения в строковой форме. Вспомогательный API PropVariantChangeType поддерживает принудительное преобразование некоторых форматов строковых дат в значения FILETIME , как показано в следующей таблице.

Формат Windows Vista, Windows XP и Microsoft Windows Desktop Search (WDS) Windows 7 Примечания
гггг/мм/дд:чч:мм:сс.уу Да Да UTC; y=год, m=месяц, d=дата, h=hours (24-часовые часы), m=minutes, s=seconds, u=microseconds
гггг-мм-ддТч:мм:ссЗ Нет Да Спецификация формата ISO8601 UTC (обозначается индикатором часового пояса Z); y=год, m=месяц, d=дата, h=hours (24-часовые часы), m=minutes, s=seconds; "T" — это разделитель для временной части.

Можно ли создать обработчик свойств только для чтения?

Да. Некоторые реализации обработчика свойств не поддерживают запись значений свойств. Эти обработчики свойств должны возвращать STGM_E_ACCESSDENIED при вызовах IInitializeXXX::Initialize , которые передают STGM_READWRITE, или при любом вызове IPropertyStore::SetValue.

Все обработчики свойств, открытые в режиме STGM_READ, должны возвращать STGM_E_ACCESSDENIED при вызовах IPropertyStore::SetValue.

Может ли обработчик свойств обрабатывать свойство как доступное только для чтения, даже если схема указывает, что свойство доступно для записи?

Да. В системе схемы свойства аннотируются как доступные только для чтения (включая свойства с isInnate = "true") или для чтения и записи. Обработчики свойств, которые не поддерживают запись определенного свойства, которое, по словам схемы, должно быть доступно для записи, должны реализовывать IPropertyStoreCapabilities и возвращать S_FALSE при вызовах IPropertyStoreCapabilities::IsPropertyWritable для этого свойства. Это означает, что в контексте этого обработчика и этого файла свойство не поддерживает запись.

Примечание

Обратное действие невозможно. Невозможно включить обработчик свойств для записи свойства, помеченного в схеме как доступное только для чтения.