Поделиться через


Установка и регистрация обработчиков протоколов (Windows Search)

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

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

Сведения о 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 возвращает одно из следующих значений:

  • PKEY_Search_UrlToIndex:

    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 реализации обработчика протокола.

Чтобы зарегистрировать обработчик протокола, выполните следующее:

  1. Зарегистрируйте независимый идентификатор 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>
    
  2. Зарегистрируйте зависимый от версии ProgID со следующими ключами и значениями:

    HKEY_CLASSES_ROOT
       <Ver_Dep_ProgID>
          (Default) = <Protocol Handler Class Description>
    
    HKEY_CLASSES_ROOT
       <Ver_Dep_ProgID>
          CLSID
             (Default) = {CLSID_1}
    
  3. Зарегистрируйте 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>
    
  4. Зарегистрируйте обработчик протокола в Службе поиска 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
    

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

Чтобы зарегистрировать обработчик типов файлов обработчика протокола (который также называется расширением оболочки), необходимо внести в реестр две записи в реестре.

  1. HKEY_LOCAL_MACHINE
       SOFTWARE
          Microsoft
             Windows
                CurrentVersion
                   Explorer
                      Desktop
                         NameSpace
                            {CLSID of PH Implementation}
                               (Default) = <Shell Implementation Description>
    
  2. 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.

Концептуальной

Общие сведения о обработчиках протоколов

Разработка обработчиков протоколов

Уведомление об индексе изменений

Добавление значков и контекстных меню

Пример кода: расширения оболочки для обработчиков протоколов

Создание Подключение поиска для обработчика протокола

Отладка обработчиков протоколов