Установка и регистрация обработчиков протоколов (Windows Search)
При установке обработчика протокола необходимо скопировать библиотеки DLL в соответствующее расположение в каталоге Program Files, а затем зарегистрировать обработчик протокола через реестр. Приложение установки также может добавить корневой каталог поиска и правила область, чтобы определить область обхода по умолчанию для источника данных Оболочки.
Этот раздел организован следующим образом:
- Сведения о URL-адресах
- Реализация интерфейсов обработчика протоколов
- Реализация обработчиков фильтров для контейнеров
- Установка и регистрация обработчика протокола
- Обеспечение индексации элементов
- Связанные статьи
Сведения о URL-адресах
Поиск Windows использует URL-адреса для уникальной идентификации элементов в иерархии источника данных Оболочки. URL-адрес, который является первым узлом в иерархии, называется корнем поиска; Поиск Windows начнет индексирование в корневом каталоге поиска, запрашивая, что обработчик протокола перечисляет дочерние ссылки для каждого URL-адреса.
Типичная структура URL-адреса:
<protocol>:// [{user SID}/] <localhost>/<path>/[<ItemID>]
Синтаксис URL-адреса описан в следующей таблице.
Синтаксис | Description |
---|---|
<protocol> | Определяет, какой обработчик протокола вызывается для URL-адреса. |
{user SID} | Определяет контекст безопасности пользователя, в котором вызывается обработчик протокола. Если идентификатор безопасности пользователя (SID) не определен, обработчик протокола вызывается в контексте безопасности системной службы. |
<path> | Определяет иерархию хранилища, где каждая косая черта ('/') является разделителем между именами папок. |
<Itemid> | Представляет уникальную строку, которая определяет дочерний элемент (например, имя файла). |
Индексатор поиска Windows обрезает окончательную косую черту из URL-адресов. В результате вы не можете полагаться на существование окончательной косой черты для идентификации каталога и элемента. Обработчик протокола должен иметь возможность обрабатывать этот синтаксис URL-адреса. Убедитесь, что выбранное имя протокола для идентификации источника данных Оболочки не конфликтует с текущими. Мы рекомендуем использовать это соглашение об именовании: companyName.scheme
Дополнительные сведения о создании источника данных Оболочки см. в разделе "Реализация базовых интерфейсов объектов папок".
Реализация интерфейсов обработчика протоколов
Для создания обработчика протокола требуется реализация следующих трех интерфейсов:
- ISearchProtocol для управления объектами UrlAccessor.
- IUrlAccessor для предоставления свойств и определения соответствующих фильтров для элементов в источнике данных Оболочки.
- IFilter для фильтрации собственных файлов или перечисления и фильтрации иерархически хранимых файлов.
Кроме трех обязательных интерфейсов, остальные интерфейсы являются необязательными, и вы можете реализовать любые необязательные интерфейсы, наиболее подходящие для задачи.
ISearchProtocol и ISearchProtocol2
Интерфейсы SearchProtocol инициализируют объекты URLAccessor обработчика протокола и управляют ими. Интерфейс ISearchProtocol2 является необязательным расширением ISearchProtocol и включает дополнительный метод, чтобы указать дополнительные сведения о пользователе и элементе.
IUrlAccessor, IUrlAccessor2, IUrlAccessor3 и IUrlAccessor4
Интерфейсы IUrlAccessor описаны в следующей таблице.
Интерфейс | Description |
---|---|
IUrlAccessor | Для указанного URL-адреса интерфейс IUrlAccessor предоставляет доступ к свойствам элемента, который предоставляется в URL-адресе. Он также может привязать эти свойства к фильтру, связанному с обработчиком протокола (т. е. фильтру, отличному от того, который связан с именем файла). |
IUrlAccessor2 (необязательно) | Интерфейс IUrlAccessor2 расширяет IUrlAccessor с методами, которые получают кодовую страницу для свойств элемента и его URL-адрес отображения и получают тип элемента в URL-адресе (документ или каталог). |
IUrlAccessor3 (необязательно) | Интерфейс IUrlAccessor3 расширяет IUrlAccessor2 с помощью метода, который получает массив пользовательских идентификаторов БЕЗОПАСНОСТИ, что позволяет узлу протокола поиска олицетворить этих пользователей индексировать элемент. |
IUrlAccessor4 (необязательно) | Интерфейс IUrlAccessor4 расширяет функциональные возможности интерфейса IUrlAccessor3 с помощью метода, который определяет, следует ли индексировать содержимое элемента. |
Объект UrlAccessor создается и инициализируется объектом SearchProtocol. Интерфейсы IUrlAccessor предоставляют доступ к важным фрагментам информации с помощью методов, описанных в следующей таблице.
Метод | Description |
---|---|
IUrlAccessor::GetLastModified | Возвращает время последнего изменения URL-адреса. Если это время более недавнее, чем последний раз, когда индексатор обработал этот URL-адрес, обработчики фильтров (реализации интерфейса IFilter ) вызываются для извлечения измененных данных для этого элемента (возможно). Время изменения для каталогов игнорируется. |
IUrlAccessor::IsDirectory | Определяет, представляет ли URL-адрес папку, содержащую дочерние URL-адреса. |
IUrlAccessor::BindToStream | Привязывается к интерфейсу IStream, представляющем данные файла в пользовательском хранилище данных. |
IUrlAccessor::BindToFilter | Привязывается к определенному обработчику протокола IFilter, который может предоставлять свойства для элемента. |
IUrlAccessor4::ShouldIndexItemContent | Определяет, следует ли индексировать содержимое элемента. |
IProtocolHandlerSite
Интерфейс IProtocolHandlerSite используется для создания экземпляра обработчика фильтра, размещенного в изолированном процессе. Соответствующий обработчик фильтра получается для указанного идентификатора постоянного класса (CLSID), класса хранилища документов или расширения имени файла. Преимущество запроса узла привязать к IFilter заключается в том, что процесс узла может управлять процессом поиска соответствующего обработчика фильтров и управлять безопасностью, связанной с вызовом обработчика.
Реализация обработчиков фильтров для контейнеров
Если вы реализуете иерархический обработчик протокола, необходимо реализовать обработчик фильтра для контейнера, который перечисляет дочерние URL-адреса. Обработчик фильтра — это реализация интерфейса IFilter. Процесс перечисления представляет собой цикл через методы IFilter::GetChunk и IFilter::GetValue интерфейса IFilter. Каждый дочерний URL-адрес предоставляется в качестве значения свойства.
IFilter::GetChunk возвращает свойства контейнера. Чтобы перечислить дочерние URL-адреса, IFilter::GetChunk возвращает одно из следующих значений:
-
URL-адрес элемента без последнего изменения времени. IFilter::GetValue возвращает PROPVARIANT, содержащий дочерний URL-адрес.
PKEY_Search_UrlToIndexWithModificationTime:
URL-адрес и время последнего изменения. IFilter::GetValue возвращает PROPVARIANT, содержащий вектор дочернего URL-адреса и время последнего изменения.
Возврат PKEY_Search_UrlToIndexWithModificationTime эффективнее, так как индексатор может немедленно определить, нужно ли индексировать элемент без вызова методов ISearchProtocol::CreateAccessor и IUrlAccessor::GetLastModified.
В следующем примере кода показано, как вернуть свойство PKEY_Search_UrlToIndexWithModificationTime .
Важно!
© Корпорация Майкрософт (Microsoft Corporation). Все права защищены.
// Parameters are assumed to be valid
HRESULT GetPropVariantForUrlAndTime
(PCWSTR pszUrl, const FILETIME &ftLastModified, PROPVARIANT **ppPropValue)
{
*ppPropValue = NULL;
// Allocate the propvariant pointer.
size_t const cbAlloc = sizeof(**ppPropValue);
*ppPropValue = (PROPVARIANT *)CoTaskMemAlloc(cbAlloc));
HRESULT hr = *ppPropValue ? S_OK : E_OUTOFMEMORY;
if (SUCCEEDED(hr))
{
PropVariantInit(*ppPropValue); // Zero init the value
// Now allocate enough memory for 2 nested PropVariants.
// PKEY_Search_UrlToIndexWithModificationTime is an array of two PROPVARIANTs.
PROPVARIANT *pVector = (PROPVARIANT *)CoTaskMemAlloc(sizeof(*pVector) * 2);
hr = pVector ? S_OK : E_OUTOFMEMORY;
if (SUCCEEDED(hr))
{
// Set the container PROPVARIANT to be a vector of two 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-адреса не изменились, так как индексатор обнаруживает удаления через процесс перечисления. Если выходные данные даты в PKEY_Search_UrlToIndexWithModificationTime указывают на то, что данные не изменились, индексатор не обновляет данные для этого URL-адреса.
Установка и регистрация обработчика протокола
Установка обработчиков протоколов включает копирование библиотек DLL в соответствующее расположение в каталоге Program Files, а затем регистрацию библиотек DLL. Обработчики протоколов должны реализовать самостоятельную регистрацию для установки. Приложение установки также может добавить корневой каталог поиска и область правила для определения область обхода по умолчанию для источника данных Оболочки, который рассматривается в разделе "Обеспечение индексации элементов" в конце этого раздела.
Рекомендации по регистрации обработчика протокола
При регистрации обработчика протокола следует следовать следующим рекомендациям:
- Установщик должен использовать установщик EXE или MSI.
- Заметки о выпуске должны быть предоставлены.
- Запись "Добавление и удаление программ" должна быть создана для каждой установленной надстройки.
- Установщик должен взять на себя все параметры реестра для определенного типа файла или сохранить, что текущая надстройка понимает.
- Если предыдущая надстройка перезаписывается, установщик должен уведомить пользователя.
- Если более новая надстройка перезаписала предыдущую надстройку, должна быть возможность восстановить функциональность предыдущей надстройки и снова сделать ее надстройкой по умолчанию для этого типа файла.
- Установщик должен определить область обхода по умолчанию для индексатора, добавив корневой каталог поиска и область правила с помощью диспетчера областей обхода (CSM).
Регистрация обработчика протокола
Чтобы зарегистрировать компонент обработчика протокола, необходимо внести в реестр четырнадцать записей, где:
- Ver_Ind_ProgID — это версия независимой progID реализации обработчика протокола.
- Ver_Dep_ProgID — это версия, зависящая от ProgID реализации обработчика протокола.
- CLSID_1 — это CLSID реализации обработчика протокола.
Чтобы зарегистрировать обработчик протокола, выполните следующее:
Зарегистрируйте независимый идентификатор ProgID версии со следующими ключами и значениями:
HKEY_CLASSES_ROOT <Ver_Ind_ProgID> (Default) = <Protocol Handler Class Description>
HKEY_CLASSES_ROOT <Ver_Ind_ProgID> CLSID (Default) = {CLSID_1}
HKEY_CLASSES_ROOT <Ver_Ind_ProgID> CurVer (Default) = <Ver_Dep_ProgID>
Зарегистрируйте зависимый от версии ProgID со следующими ключами и значениями:
HKEY_CLASSES_ROOT <Ver_Dep_ProgID> (Default) = <Protocol Handler Class Description>
HKEY_CLASSES_ROOT <Ver_Dep_ProgID> CLSID (Default) = {CLSID_1}
Зарегистрируйте CLSID обработчика протокола со следующими ключами и значениями:
HKEY_CLASSES_ROOT {CLSID_1} (Default) = <Protocol Handler Class Description>
HKEY_CLASSES_ROOT {CLSID_1} {InprocServer32} (Default) = <DLL Install Path> Threading Model = Both
HKEY_CLASSES_ROOT {CLSID_1} <ProgID> (Default) = <Ver_Dep_ProgID>
HKEY_CLASSES_ROOT {CLSID_1} <ShellFolder> Attributes = dword:a0180000
HKEY_CLASSES_ROOT {CLSID_1} TypeLib (Default) = {LIBID of PH Component}
HKEY_CLASSES_ROOT {CLSID_1} VersionIndependentProgID (Default) = <Ver_Ind_ProgID>
Зарегистрируйте обработчик протокола в Службе поиска Windows. В следующем примере <имя> протокола — это имя самого протокола, например file, mapi и т. д.:
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows Search ProtocolHandlers <Protocol Name> = <Ver_Dep_ProgID>
HKEY_CURRENT_USER SOFTWARE Microsoft Windows Search ProtocolHandlers <Protocol Name> = <Ver_Dep_ProgID>
До Windows Vista:
HKEY_CURRENT_USER SOFTWARE Microsoft Windows Desktop Search DS Index ProtocolHandlers <Protocol Name> HasRequirements = dword:00000000 HasStartPage = dword:00000000
Регистрация обработчика типов файлов обработчика протокола
Чтобы зарегистрировать обработчик типов файлов обработчика протокола (который также называется расширением оболочки), необходимо внести в реестр две записи в реестре.
-
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Explorer Desktop NameSpace {CLSID of PH Implementation} (Default) = <Shell Implementation Description>
-
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Explorer Shell Extensions Approved {CLSID of PH Implementation} = <Shell Implementation Description>
Обеспечение индексации элементов
После реализации обработчика протокола необходимо указать, какие элементы оболочки обработчик протокола должен индексировать. Диспетчер каталогов можно использовать для запуска повторного индексирования (дополнительные сведения см. в разделе "Использование диспетчера каталогов"). Кроме того, можно использовать диспетчер областей обхода (CSM) для настройки правил по умолчанию, указывающих URL-адреса, которые требуется выполнить индексатор (дополнительные сведения см. в разделе "Использование диспетчера областей обхода" и управления правилами области). Вы также можете добавить корневой каталог поиска (дополнительные сведения см. в разделе "Управление корневыми данными поиска"). Еще одним вариантом является выполнение процедуры в примере ReIndex в примерах кода поиска Windows.
Интерфейс ISearchCrawlScopeManager предоставляет методы, которые уведомляют поисковую систему контейнеров для обхода и (или) просмотра и элементов под этими контейнерами для включения или исключения при обходе или просмотре. В Windows 7 и более поздних версиях ISearchCrawlScopeManager2 расширяет ISearchCrawlScopeManager с помощью метода ISearchCrawlScopeManager2::GetVersion, который сообщает клиентам, изменилось ли состояние CSM.
См. также
-
Концептуальной
-
Пример кода: расширения оболочки для обработчиков протоколов