Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе объясняется, как создавать и регистрировать обработчики свойств для работы с системой свойств 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, так как они пытаются получить доступ к этим файлам или индексировать их. Дополнительные сведения см. в Инициализация обработчиков свойств.
Одним из полезных способов этого является заполнение заголовка файла дополнительным пространством, чтобы при следующем написании значения свойства значение можно записать на месте, не перезаписав весь файл. Для этого требуется функция ManualSafeSave. Этот подход связан с некоторым дополнительным риском, что операция записи файла может быть прервана во время записи (из-за сбоя системы или потери питания), но поскольку размеры свойств обычно невелики, вероятность такого прерывания аналогично малая, а производительные выгоды, которые можно получить благодаря записи свойств на месте, считаются достаточно значительными, чтобы оправдать этот дополнительный риск. Несмотря на это, необходимо тщательно протестировать реализацию, чтобы убедиться, что файлы не повреждены в случае сбоя в ходе операции записи.
Наконец, при реализации записи свойств в процессе с помощью ManualSafeSave иногда операция не может быть выполнена непосредственно, и всё равно весь поток должен быть перезаписан. Чтобы упростить перезапись, поток, предоставленный во время инициализации обработчика, поддерживает интерфейс IDestinationStreamFactory. Интерфейс IDestinationStreamFactory позволяет обработчикам реализовать временный поток для записи; при завершении всех операций записи и вызове метода IDestinationStreamFactory::GetDestinationStream этот поток используется для полной замены исходного потока файлов. При использовании целевого потока исходный файловый поток должен рассматриваться как доступный только для чтения, так как он будет заменен целевым потоком после вызова метода IDestinationStreamFactory::GetDestinationStream.
Выбор моделей потоков COM
Чтобы повысить эффективность обработчика свойств, следует указать, что она использует модель потоков COM
Both
. Это обеспечивает прямой доступ из потоков STA (например, Проводник Windows) и потоков агента передачи сообщений MTA (например, процесс SearchProtocolHost в Windows Search), избегая затрат на маршалинг в этих средах. Чтобы полностью воспользоваться преимуществами модели потоковBoth
, все службы, от которых зависит ваш обработчик, также должны быть помечены какBoth
, чтобы избежать маршалинга вызовов к этим компонентам. Проверьте документацию этих конкретных служб, чтобы проверить, используют ли они эту модель потоков.параллелизм обработчика свойств
Обработчики свойств и интерфейс IPropertyStore предназначены для последовательного, а не для параллельного доступа. Обозреватель Windows, индексатор поиска Windows и все другие вызовы обработчика свойств из базы кода Windows гарантируют это использование. Не должно быть оснований для параллельного использования обработчика свойств третьими лицами, но это поведение не может быть гарантировано. Кроме того, несмотря на то, что шаблон вызова должен быть последовательным, вызовы могут возникать на разных потоках (например, когда объект вызывается удаленно через COM RPC, как происходит в индексаторе). Поэтому реализации обработчика свойств должны поддерживаться в разных потоках, и в идеале не должны страдать от каких-либо плохих последствий при одновременном вызове. Так как предполагаемый шаблон вызова является последовательным, тривиальная реализация, использующая критически важный раздел, должна быть достаточной для удовлетворения этих требований в большинстве случаев. Допустимо избегать блокировки одновременных вызовов, используя функцию TryEnterCriticalSection для обнаружения и предотвращения одновременных вызовов.
параллелизм файлов
Обработчики свойств часто используются в сценариях, когда несколько приложений обращаются к файлу одновременно. Поэтому обработчик и приложения должны управлять параллелизмом, указывая соответствующие режимы общего доступа при открытии файла. Они также должны знать о доступе, который другие приложения указывают и управляют случаями, когда доступ не разрешен. Лучше всего, если все потребители указывают режимы либерального общего доступа, чтобы другие пользователи могли одновременно получать доступ к файлу, но при этом необходимо управлять проблемами согласованности. Решения о наиболее подходящих режимах общего доступа, которые необходимо использовать, необходимо принять в контексте сообщества приложений, обращаюющихся к файлу.
Файловые системы позволяют приложениям открывать файлы таким образом, чтобы они могли управлять тем, могут ли другие приложения открывать файл. Режимы общего доступа обеспечивают доступ для чтения, записи и удаления. Система свойств поддерживает подмножество этих режимов общего доступа, описанное в следующей таблице.
Режим доступа Режим общего доступа Писать Отказать доступ другим читателям и писателям Запись (EnableShareDenyWrite) Включение других читателей, запрет других писателей Только для чтения (по умолчанию) Включение других читателей, запрет других писателей Только для чтения (EnableShareDenyNone) Содействие другим читателям и писателям Обработчики свойств, открытые для записи (GPS_READWRITE), отклонят других читателей и писателей. Обработчики могут выбрать поведение, включающее режим чтения для пользователей, указав флаг
EnableShareDenyWrite
(подразумевающий включение режима чтения) в регистрации.Обработчики свойств, открытые для чтения (GPS_DEFAULT), по умолчанию позволяют другим читателям, но запрещать другие записи. Обработчики могут включить других авторов, указав флаг
EnableShareDenyNone
в своей регистрации. Это означает, что обработчик может успешно справиться с ситуацией, в которой содержимое файла изменяется во время чтения файла обработчиком.Определения флагов см. в разделе GETPROPERTYSTOREFLAGS.
Связанные разделы
-
Рекомендации по обработчику свойств и часто задаваемые вопросы