Compartilhar via


Implementando um manipulador de protocolo para WDS

Observação

O Windows Desktop Search 2.x é uma tecnologia obsoleta que estava originalmente disponível como um suplemento para Windows XP e Windows Server 2003. Em versões posteriores, use a Pesquisa do Windows .

A criação de um manipulador de protocolo envolve a implementação de ISearchProtocol para gerenciar objetos UrlAccessor, IUrlAccessor para gerar metadados sobre e identificar filtros apropriados para itens no armazenamento de dados, IProtocolHandlerSite para instanciar um objeto SearchProtocol e identificar filtros apropriados e IFilterpara filtrar arquivos proprietários ou para enumerar e filtrar arquivos armazenados hierarquicamente. O manipulador de protocolo deve ser multithread.

Estas seções contêm os seguintes tópicos:

Observação sobre URLs

A Pesquisa de Área de Trabalho do Microsoft Windows (WDS) usa URLs para identificar exclusivamente itens em um sistema de arquivos, dentro de um repositório semelhante a um banco de dados ou na Web. Uma URL que define um nó de entrada é chamada de página inicial; O WDS começa nessa página inicial e rastreia recursivamente o armazenamento de dados. A estrutura de URL típica é:

protocol://host/path/name.extension

Observação

Quando quiser adicionar um novo armazenamento de dados, você precisará selecionar um nome para identificá-lo que não esteja em conflito com os atuais. Recomendamos essa convenção de nomenclatura: companyName.scheme.

 

Interfaces do manipulador de protocolo

ISearchProtocol

A interface ISearchProtocol invoca, inicializa e gerencia objetos UrlAccessor. Para obter mais informações sobre como implementar a interface ISearchProtocol, consulte Referência da interface ISearchProtocol.

IUrlAccessor

Para uma URL especificada, a interface IUrlAccessor gera metadados sobre a estrutura de localização, bem como itens contidos, e associa esses itens a um filtro. O objeto IUrlAccessor é instanciado e inicializado por um objeto SearchProtocol; no entanto, você também pode implementar um método de inicialização interna para que seu objeto IUrlAccessor possa executar tarefas de inicialização específicas para o manipulador de protocolo, como validar a URL de um item que está sendo acessado ou verificar a hora da última modificação para determinar se um arquivo deve ser processado no rastreamento atual.

Observação

Os horários modificados para diretórios são ignorados. O objeto IUrlAccessor deve enumerar os objetos filho para determinar se houve modificações ou exclusões.

 

Grande parte do design do objeto UrlAccessor depende se a estrutura é hierárquica ou baseada em link. Para armazenamentos de dados hierárquicos, o objeto UrlAccessor deve encontrar um filtro que possa enumerar seu conteúdo. Outra distinção entre manipuladores de protocolo hierárquicos e baseados em link é o uso do método IsDirectory. Em manipuladores de protocolo baseados em link, esse método deve retornar S_FALSE. Manipuladores de protocolo hierárquico devem retornar S_OK para contêineres.

Para obter mais instruções sobre como implementar uma interface IUrlAccessor , consulte a referência da Interface IUrlAccessor .

IProtocolHandlerSite

Essa interface é usada para instanciar um objeto SearchProtocol e também fornece ao objeto UrlAccessor um filtro apropriado para uma CLSID (ID de classe) especificada.

IFilters para contêineres

Se você estiver implementando um manipulador de protocolo hierárquico, deverá implementar um componente IFilterde contêiner que enumera URLs que representam contêineres ou pastas. O processo de enumeração é um loop por meio dos métodos GetChunk e GetValue da interface IFilter que retornam uma lista de URLs que representam cada item no contêiner.

Primeiro, GetChunk retorna um FULLPROSPEC com o conjunto de propriedades GATHER_PROPSET e:

  • PID_GTHR_DIRLINK, a URL para o item sem a hora da última modificação ou
  • PID_GTHR_DIRLINK_WITH_TIME, a URL junto com a hora da última modificação

O GUID do conjunto de propriedades para GATHER_PROPSET é 0B63E343-9CCC-11D0-BCDB-00805FCCCE04. A propriedade PROPSPEC é PID_GTHR_DIRLINK=2 ou PID_GTHR_DIRLINK_WITH_TIME = 12 decimais.

Retornar PID_GTHR_DIRLINK_WITH_TIME é mais eficiente porque o indexador pode determinar imediatamente se o item precisa ser indexado sem chamar os métodos ISearchProtocol-CreateUrlAccessor>() e IUrlAccessor-GetLastModified>().

Em seguida, GetValue retorna um PROPVARIANT para a URL (e a hora da última modificação, se usada), como:

  • VT_LPWSTR, a URL do item filho ou
  • Vetor da URL seguido por um FILETIME

O código de exemplo a seguir demonstra como criar a PID_GTHR_DIRLINK_WITH_TIME adequada.

Observação

ESSE CÓDIGO E INFORMAÇÕES SÃO FORNECIDOS "COMO ESTÃO" SEM GARANTIA DE QUALQUER TIPO, EXPRESSO OU IMPLÍCITO, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS IMPLÍCITAS DE COMERCIALIZAÇÃO E/OU ADEQUAÇÃO PARA UMA FINALIDADE ESPECÍFICA.

Direitos autorais (C) Microsoft. All rights reserved.

 

// 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;
}

Observação

Um componente IFilterde contêiner deve sempre enumerar todas as URLs filho mesmo que as URLs filho não tenham sido alteradas, porque o Indexador detecta exclusões por meio do processo de enumeração. Se a saída de data em um DIR_LINKS_WITH_TIME indicar que os dados não foram alterados, o indexador não atualizará os dados dessa URL.

 

A URL física é a URL que o objeto UrlAccessor processa. Se o filtro não emitir um DisplayUrl amigável, o WDS exibirá a URL física para o usuário como parte dos resultados da pesquisa. O esquema WDS contém duas propriedades para controlar o que é exibido para o usuário final, conforme mostrado na tabela abaixo.

GUID PROPSPEC Descrição
D5CDD505-2E9C-101B-9397-08002B2CF9AE DisplayFolder Caminho da Pasta exibido para o usuário nos resultados da pesquisa
D5CDD505-2E9C-101B-9397-08002B2CF9AE FolderName Nome de exibição da pasta pai

 

Se o código não emitir um DisplayFolder ou FolderName, esses valores serão calculados do DisplayUrl. Encaminhar barras na URL denota contêineres dentro do repositório ou sistema de arquivos.

Adicionando funcionalidade de opções do manipulador de protocolo

Para que o manipulador de protocolo tenha uma página inicial padrão (e a URL do nó de entrada), você deve implementar a interface ISearchProtocolOptions . Em versões futuras do WDS, essa interface fornecerá ganchos para a caixa de diálogo Opções para uma experiência aprimorada do usuário. Essa interface fornece a seguinte funcionalidade:

  • Determina se os requisitos para o manipulador de protocolo são atendidos. Por exemplo, o repositório do manipulador de protocolo pode exigir acesso a um determinado aplicativo para indexar corretamente os dados do aplicativo, mas esse aplicativo não está disponível.
  • Identifica os requisitos mínimos que o manipulador de protocolo precisa para processar um item. Os requisitos podem ser expressos em uma descrição amigável e localizada, como "Microsoft Outlook 2000 ou superior".
  • Define as URLs que o manipulador de protocolo deve processar por padrão.

ISearchProtocolOptions

A tabela a seguir descreve os métodos que você precisa implementar para a interface ISearchProtocolOptions .

Método Descrição
CheckRequirements Determina se os requisitos mínimos de um manipulador de protocolo personalizado são atendidos
GetDefaultCrawlScope Retorna uma lista de URLs padrão em um repositório especificado para um manipulador de protocolo personalizado
GetRequirements Identifica uma descrição amigável e localizada dos requisitos mínimos para um manipulador de protocolo personalizado

 

Referência

Notificando o índice de alterações

Adicionar ícones, visualizações e menus de contexto com extensões de shell

Instalando e registrando manipuladores de protocolo