Реализация обработчика протокола для WDS
Примечание
Windows Desktop Search 2.x — это устаревшая технология, которая изначально была доступна в качестве надстройки для Windows XP и Windows Server 2003. В более поздних выпусках используйте Windows Search .
Создание обработчика протокола включает в себя реализацию ISearchProtocol для управления объектами UrlAccessor, IUrlAccessor для создания метаданных о и для определения соответствующих фильтров для элементов в хранилище данных, IProtocolHandlerSite для создания экземпляра объекта SearchProtocol и определения соответствующих фильтров и IFilterдля фильтрации собственных файлов или для перечисления и фильтрации иерархически хранящихся файлов. Обработчик протокола должен быть многопотоковый.
Эти разделы содержат следующие разделы:
- Примечание о URL-адресах
- Интерфейсы обработчика протоколов
- IFilters для контейнеров
- Добавление параметров обработчика протокола
- Связанные темы
Примечание о URL-адресах
Microsoft Windows Desktop Search (WDS) использует URL-адреса для уникальной идентификации элементов в файловой системе, в хранилище, похожем на базу данных, или в Интернете. URL-адрес, определяющий узел входа, называется начальной страницей; Служба WDS начинается с этой начальной страницы и рекурсивно сканирует хранилище данных. Типичная структура URL-адреса:
protocol://host/path/name.extension
Примечание
Если вы хотите добавить новое хранилище данных, необходимо выбрать имя, чтобы определить его, которое не конфликтует с текущими. Рекомендуется использовать это соглашение об именовании: companyName.scheme.
Интерфейсы обработчика протоколов
ISearchProtocol
Интерфейс ISearchProtocol вызывает, инициализирует и управляет объектами UrlAccessor. Дополнительные сведения о реализации интерфейса ISearchProtocol см. в справочнике по интерфейсу ISearchProtocol.
IUrlAccessor
Для указанного URL-адреса интерфейс IUrlAccessor создает метаданные о структуре расположения и содержащихся элементах, а также привязывает эти элементы к фильтру. Объект IUrlAccessor создается и инициализируется объектом SearchProtocol; однако вы также можете реализовать метод внутренней инициализации, чтобы объект IUrlAccessor выполнял задачи инициализации, относящиеся к обработчику протокола, такие как проверка URL-адреса элемента, к которой осуществляется доступ, или проверка времени последнего изменения, чтобы определить, нужно ли обрабатывать файл в текущем обходе контента.
Примечание
Время изменения для каталогов игнорируется. Объект IUrlAccessor должен перечислить дочерние объекты, чтобы определить, были ли какие-либо изменения или удаления.
Большая часть структуры объекта UrlAccessor зависит от того, является ли структура иерархической или на основе ссылок. Для иерархических хранилищ данных объект UrlAccessor должен найти фильтр, который может перечислить их содержимое. Еще одним различием между иерархическими обработчиками протоколов и обработчиками протоколов на основе ссылок является использование метода IsDirectory. В обработчиках протокола на основе ссылок этот метод должен возвращать S_FALSE. Иерархические обработчики протоколов должны возвращать S_OK для контейнеров.
Дополнительные инструкции по реализации интерфейса IUrlAccessor см. в справочнике по интерфейсу IUrlAccessor .
IProtocolHandlerSite
Этот интерфейс используется для создания экземпляра объекта SearchProtocol , а также предоставляет объекту UrlAccessor соответствующий фильтр для указанного идентификатора класса (CLSID).
IFilters для контейнеров
При реализации иерархического обработчика протокола необходимо реализовать компонент IFilterконтейнера, который перечисляет URL-адреса, представляющие контейнеры или папки. Процесс перечисления представляет собой цикл через методы GetChunk и GetValue интерфейса IFilter, которые возвращают список URL-адресов, представляющих каждый элемент в контейнере.
Во-первых, GetChunk возвращает FULLPROSPEC со свойством, заданным GATHER_PROPSET и:
- PID_GTHR_DIRLINK, URL-адрес элемента без времени последнего изменения;
- PID_GTHR_DIRLINK_WITH_TIME, URL-адрес вместе с временем последнего изменения
Идентификатор GUID набора свойств для GATHER_PROPSET имеет значение 0B63E343-9CCC-11D0-BCDB-00805ОВИМЯ04. Свойство PROPSPEC имеет значение PID_GTHR_DIRLINK=2 или PID_GTHR_DIRLINK_WITH_TIME = 12 десятичных разрядов.
Возврат PID_GTHR_DIRLINK_WITH_TIME более эффективен, так как индексатор может сразу определить, требуется ли индексировать элемент, не вызывая методы ISearchProtocol-CreateUrlAccessor>() и IUrlAccessor-GetLastModified>().
Затем GetValue возвращает PROPVARIANT для URL-адреса (и время последнего изменения, если он использовался) в виде:
- VT_LPWSTR, URL-адрес дочернего элемента или
- Вектор URL-адреса, за которым следует FILETIME
В следующем примере кода показано, как создать соответствующую PID_GTHR_DIRLINK_WITH_TIME.
Примечание
ЭТОТ КОД И ИНФОРМАЦИЯ ПРЕДОСТАВЛЯЮТСЯ "КАК ЕСТЬ" БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, ПОМИМО ПРОЧЕГО, ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ ТОВАРНОЙ ПРИГОДНОСТИ И/ИЛИ ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.
Авторские права (C) Майкрософт. Все права защищены.
// params are assumed to be valid
HRESULT GetPropVariantForUrlAndTime(PCWSTR pszUrl, const FILETIME &ftLastModified, PROPVARIANT **ppPropValue)
{
*ppPropValue = NULL;
// allocate the propvariant pointer
*ppPropValue = (PROPVARIANT *)CoTaskMemAlloc(sizeof(*ppPropValue));
HRESULT hr = *ppPropValue ? S_OK : E_OUTOFMEMORY;
if (SUCCEEDED(hr))
{
PropVariantInit(*ppPropValue); // zero init the value
// now allocate enough memory for 2 nested PropVariants.
// PID_GTHR_DIRLINK_WITH_TIME is an array of 2 PROPVARIANTs
PROPVARIANT *pVector = (PROPVARIANT *)CoTaskMemAlloc(sizeof(*pVector) * 2);
hr = pVector ? S_OK : E_OUTOFMEMORY;
if (SUCCEEDED(hr))
{
// set the container PROPVARIANT that it is a vector of 2 PROPVARIANTS
(*ppPropValue)->vt = VT_VARIANT | VT_VECTOR;
(*ppPropValue)->capropvar.cElems = 2;
(*ppPropValue)->capropvar.pElems = pVector;
PWSTR pszUrlAlloc;
hr = SHStrDup(pszUrl, &pszUrlAlloc);
if (SUCCEEDED(hr))
{
// now fill the array of PROPVARIANTS
// put the pointer to the URL into the vector
(*ppPropValue)->capropvar.pElems[0].vt = VT_LPWSTR;
(*ppPropValue)->capropvar.pElems[0].pwszVal = pszUrlAlloc;
// put the FILETIME into vector
(*ppPropValue)->capropvar.pElems[1].vt = VT_FILETIME;
(*ppPropValue)->capropvar.pElems[1].filetime = ftLastModified;
}
else
{
CoTaskMemFree(pVector);
}
}
if (FAILED(hr))
{
CoTaskMemFree(*ppPropValue);
*ppPropValue = NULL;
}
}
return S_OK;
}
Примечание
Компонент IFilterконтейнера всегда должен перечислять все дочерние URL-адреса, даже если дочерние URL-адреса не изменились, так как индексатор обнаруживает удаления в процессе перечисления. Если выходные данные даты в DIR_LINKS_WITH_TIME указывают на то, что данные не изменились, индексатор не обновляет данные для этого URL-адреса.
Физический URL-адрес — это URL-адрес, который обрабатывает объект UrlAccessor . Если фильтр не выдает понятный для пользователя DisplayUrl, WDS отображает физический URL-адрес пользователя в результатах поиска. Схема WDS содержит два свойства для управления тем, что отображается для конечного пользователя, как показано в таблице ниже.
GUID | PROPSPEC | Описание |
---|---|---|
D5CDD505-2E9C-101B-9397-08002B2CF9AE | DisplayFolder | Путь к папке, отображаемый пользователю в результатах поиска |
D5CDD505-2E9C-101B-9397-08002B2CF9AE | FolderName | Отображаемое имя родительской папки |
Если код не выдает DisplayFolder или FolderName, эти значения вычисляются на основе DisplayUrl. Косая черта в URL-адресе обозначает контейнеры в хранилище или файловой системе.
Добавление параметров обработчика протокола
Чтобы у обработчика протокола была начальная страница по умолчанию (и URL-адрес узла входа), необходимо реализовать интерфейс ISearchProtocolOptions . В будущих версиях WDS этот интерфейс будет предоставлять обработчики диалогового окна Параметры для улучшения взаимодействия с пользователем. Этот интерфейс предоставляет следующие функциональные возможности:
- Определяет, выполнены ли требования к обработчику протокола. Например, хранилищу обработчика протокола может потребоваться доступ к данному приложению, чтобы правильно индексировать данные приложения, но это приложение недоступно.
- Определяет минимальные требования, необходимые обработчику протокола для обработки элемента. Требования можно выразить в понятном локализованном описании, например "Microsoft Outlook 2000 или более поздней версии".
- Определяет URL-адреса, которые обработчик протокола должен обрабатывать по умолчанию.
ISearchProtocolOptions
В следующей таблице описаны методы, которые необходимо реализовать для интерфейса ISearchProtocolOptions .
Метод | Описание |
---|---|
CheckRequirements | Определяет, выполнены ли минимальные требования пользовательского обработчика протокола. |
GetDefaultCrawlScope | Возвращает список URL-адресов по умолчанию в указанном хранилище для пользовательского обработчика протокола. |
GetRequirements | Определяет понятное для пользователя локализованное описание минимальных требований для пользовательского обработчика протокола. |
Связанные темы
-
Reference
-
Добавление значков, предварительных просмотров и контекстных меню с помощью расширений оболочки