Регистрация и распределение обработчиков свойств

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

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

Регистрация и распределение обработчиков свойств

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

HKEY_CLASSES_ROOT
   CLSID
      {50d9450f-2a80-4f08-93b9-2eb526477d1a}
         (Default) = Recipe Property Handler
         ManualSafeSave [REG_DWORD] = 00000001
         InProcServer32
            (Default) = C:\\SDK\\PropertyHandlerSample\\bin\\RecipeHandlers.dll
            ThreadingModel = Apartment
HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows
            CurrentVersion
               PropertySystem
                  PropertyHandlers
                     .recipe
                        (Default) = {50d9450f-2a80-4f08-93b9-2eb526477d1a}

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

  • Сведения о регистрации обработчика свойств, указанные в разделе Регистрация и распространение обработчиков свойств.
  • Регистрация для типа файлов и всех файлов схемы, которые необходимо установить, чтобы клиенты могли получать доступ ко всем функциям обработчика свойств.

Вопросы производительности и надежности обработчиков свойств

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

  • Во время индексирования файла. Это делается вне процесса в изолированном процессе с ограниченными правами.
  • При доступе к файлам в Windows Обозреватель для чтения и записи значений свойств. Это выполняется в процессе.

Рекомендации по производительности и надежности

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

При разработке и тестировании обработчика свойств учитывайте следующие рекомендации.

  • Перечисление свойств

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

  • Запись свойств на месте

    Если это возможно, при работе с файлами среднего или большого размера (несколько сотен КБ или больше) формат файла должен быть упорядочен таким образом, чтобы для чтения или записи значений свойств не требовалось чтение всего файла с диска. Даже если требуется искать файл, его не следует считать в памяти целиком, так как это раздувает рабочий набор windows Обозреватель или индексатор Windows Search при попытке получить доступ к этим файлам или индексировать их. Дополнительные сведения см. в разделе Инициализация обработчиков свойств.

    Одним из полезных методов для этого является заполнение заголовка файла дополнительным пространством, чтобы при следующей записи значения свойства значение можно было записать на месте без необходимости перезаписи всего файла. Для этого требуется функциональность ManualSafeSave. Этот подход сопряжен с дополнительным риском прерывания операции записи файла во время записи (из-за сбоя системы или потери питания), но поскольку размеры свойств обычно невелики, вероятность такого прерывания столь же мала, а повышение производительности, которое может быть достигнуто путем записи свойств на месте, считается достаточно значительным, чтобы оправдать этот дополнительный риск. Несмотря на это, следует тщательно протестировать реализацию, чтобы убедиться, что файлы не повреждены в случае сбоя в ходе операции записи.

    Наконец, при реализации записи свойств на месте с помощью ManualSafeSave иногда операция не может быть выполнена на месте, и весь поток необходимо переписать в любом случае. Для упрощения перезаписи поток, предоставляемый во время инициализации обработчика, поддерживает интерфейс IDestinationStreamFactory . Интерфейс IDestinationStreamFactory позволяет реализовать обработчика для получения временного потока для записи; После завершения всех операций записи и вызова метода IDestinationStreamFactory::GetDestinationStream этот поток используется для полной замены исходного потока файлов. При использовании целевого потока исходный файловый поток должен рассматриваться как доступный только для чтения, так как он будет заменен потоком назначения после вызова метода IDestinationStreamFactory::GetDestinationStream .

  • Выбор модели потоков COM

    Чтобы обеспечить максимальную эффективность обработчика свойств, следует указать, что он использует модель Bothпотоков COM. Это обеспечивает прямой доступ из квартир STA (например, Windows Обозреватель) и из квартир агента передачи сообщений (MTA) (например, процесс SearchProtocolHost в Windows Search), избегая затрат на маршалинг в этих средах. Чтобы обеспечить все преимущества потоковой Both модели, все службы, от которых зависит ваш обработчик, также должны быть назначены как Both во избежание маршалинга в вызовах этих компонентов. Ознакомьтесь с документацией по этим службам, чтобы проверить, используют ли они эту потоковую модель.

  • Параллелизм обработчика свойств

    Обработчики свойств и интерфейс IPropertyStore предназначены для последовательного, а не параллельного доступа. Windows Обозреватель, индексатор Windows Search и все другие вызовы обработчиков свойств из базы кода Windows гарантируют такое использование. У третьих лиц не должно быть оснований для параллельного использования обработчика свойств, но это поведение не может быть гарантировано. Кроме того, несмотря на то, что шаблон вызова должен быть последовательным, вызовы могут выполняться в разных потоках (например, при удаленном вызове объекта через COM RPC, как это происходит в индексаторе). Таким образом, реализации обработчика свойств должны поддерживать вызов в разных потоках и в идеале не должны испытывать никаких побочных эффектов при одновременном вызове. Так как предполагаемый шаблон вызова является последовательным, тривиальной реализации с использованием критического раздела в большинстве случаев должно быть достаточно для удовлетворения этих требований. Допустимо избежать блокировки одновременных вызовов с помощью функции TryEnterCriticalSection для обнаружения и сбоя параллельных вызовов.

  • Параллелизм файлов

    Обработчики свойств часто используются в сценариях, когда несколько приложений обращаются к файлу одновременно. Следовательно, обработчик и приложения должны управлять параллелизмом, указывая соответствующие режимы общего доступа при открытии файла. Они также должны знать о доступе, который указывают другие приложения, и управлять случаями, в которых доступ запрещен. Лучше всего, если все потребители указывают либеральные режимы общего доступа, чтобы другие пользователи могли одновременно получать доступ к файлу, но при этом необходимо управлять проблемами согласованности. Решения о наиболее подходящих режимах общего доступа необходимо принимать в контексте сообщества приложений, которые обращаются к файлу.

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

    Режим доступа Режим общего доступа
    Write Запретить другим читателям и авторам
    Запись (EnableShareDenyWrite) Включение других модулей чтения и запрет других модулей записи
    Доступ только для чтения (по умолчанию) Включение других модулей чтения и запрет других модулей записи
    Только для чтения (EnableShareDenyNone) Включение других модулей чтения и записи

     

    Обработчики свойств, открытые для записи (GPS_READWRITE), запрещают другим модулям чтения и записи. Обработчики могут согласиться с поведением, которое включает средства чтения, указывая EnableShareDenyWrite флаг (подразумевающий включение чтения) в его регистрации.

    Обработчики свойств, открытые для чтения (GPS_DEFAULT), по умолчанию поддерживают другие средства чтения, но запрещают другие записи. Обработчики могут согласиться на включение других модулей записи, указав EnableShareDenyNone флаг в его регистрации. Это означает, что обработчик может успешно обрабатывать ситуацию, в которой содержимое файла изменяется, пока обработчик считывает файл.

    Определения флагов см. в разделе GETPROPERTYSTOREFLAGS.

Основные сведения о обработчиках свойств

Использование имен типов

Использование списков свойств

Инициализация обработчиков свойств

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