Compartir a través de


Implementar un controlador de protocolo para WDS

Nota

Windows Desktop Search 2.x es una tecnología obsoleta que originalmente estaba disponible como complemento para Windows XP y Windows Server 2003. En versiones posteriores, use Windows Search en su lugar.

La creación de un controlador de protocolo implica la implementación de ISearchProtocol para administrar objetos UrlAccessor, IUrlAccessor para generar metadatos sobre e identificar los filtros adecuados para los elementos del almacén de datos, IProtocolHandlerSite para crear instancias de un objeto SearchProtocol e identificar los filtros adecuados, e IFilterpara filtrar archivos propietarios o para enumerar y filtrar archivos almacenados jerárquicamente. El controlador de protocolo debe ser multiproceso.

En estas secciones se incluyen los temas siguientes:

Nota sobre las direcciones URL

Búsqueda de escritorio de Microsoft Windows (WDS) usa direcciones URL para identificar de forma única los elementos de un sistema de archivos, dentro de un almacén similar a la base de datos o en la Web. Una dirección URL que define un nodo de entrada se denomina página de inicio; WDS comienza en esa página de inicio y rastrea de forma recursiva el almacén de datos. La estructura de dirección URL típica es:

protocol://host/path/name.extension

Nota

Cuando quiera agregar un nuevo almacén de datos, deberá seleccionar un nombre para identificarlo que no entre en conflicto con los actuales. Se recomienda esta convención de nomenclatura: companyName.scheme.

 

Interfaces de controlador de protocolo

ISearchProtocol

La interfaz ISearchProtocol invoca, inicializa y administra objetos UrlAccessor. Para obtener más información sobre la implementación de la interfaz ISearchProtocol, consulte ISearchProtocol Interface reference(Referencia de la interfaz ISearchProtocol).

IUrlAccessor

Para una dirección URL especificada, la interfaz IUrlAccessor genera metadatos sobre la estructura de ubicación, así como elementos contenidos, y enlaza esos elementos a un filtro. Se crea una instancia del objeto IUrlAccessor y se inicializa mediante un objeto SearchProtocol; Sin embargo, también puede implementar un método de inicialización interno para que el objeto IUrlAccessor pueda realizar tareas de inicialización específicas del controlador de protocolo, como validar la dirección URL de un elemento al que se accede o comprobar la hora de la última modificación para determinar si un archivo debe procesarse en el rastreo actual.

Nota

Se omiten los tiempos modificados de los directorios. El objeto IUrlAccessor debe enumerar los objetos secundarios para determinar si se han producido modificaciones o eliminaciones.

 

Gran parte del diseño del objeto UrlAccessor depende de si la estructura es jerárquica o basada en vínculos. En el caso de los almacenes de datos jerárquicos, el objeto UrlAccessor debe encontrar un filtro que pueda enumerar su contenido. Otra distinción entre los controladores de protocolo jerárquicos y basados en vínculos es el uso del método IsDirectory. En los controladores de protocolo basados en vínculos, este método debe devolver S_FALSE. Los controladores de protocolo jerárquicos deben devolver S_OK para los contenedores.

Para obtener más instrucciones sobre cómo implementar una interfaz IUrlAccessor , consulta la referencia de la interfaz IUrlAccessor .

IProtocolHandlerSite

Esta interfaz se usa para crear instancias de un objeto SearchProtocol y también proporciona el objeto UrlAccessor con un filtro adecuado para un identificador de clase especificado (CLSID).

IFilters for Containers

Si va a implementar un controlador de protocolo jerárquico, debe implementar un componente IFilterde contenedor que enumere las direcciones URL que representan contenedores o carpetas. El proceso de enumeración es un bucle a través de los métodos GetChunk y GetValue de la interfaz IFilter que devuelven una lista de direcciones URL que representan cada elemento del contenedor.

En primer lugar, GetChunk devuelve fullPROSPEC con la propiedad establecida GATHER_PROPSET y:

  • PID_GTHR_DIRLINK, la dirección URL del elemento sin la hora de la última modificación o
  • PID_GTHR_DIRLINK_WITH_TIME, la dirección URL junto con la hora de la última modificación

El GUID del conjunto de propiedades para GATHER_PROPSET es 0B63E343-9CCC-11D0-BCDB-00805FCCCE04. La propiedad PROPSPEC es PID_GTHR_DIRLINK=2 o PID_GTHR_DIRLINK_WITH_TIME = 12 decimales.

Devolver PID_GTHR_DIRLINK_WITH_TIME es más eficaz porque el indexador puede determinar inmediatamente si el elemento debe indexarse sin llamar a los métodos ISearchProtocol-CreateUrlAccessor>() e IUrlAccessor-GetLastModified>().

A continuación , GetValue devuelve un PROPVARIANT para la dirección URL (y la hora de última modificación si se usa), como:

  • VT_LPWSTR, la dirección URL del elemento secundario o
  • Vector de la dirección URL seguida de filetime

En el código de ejemplo siguiente se muestra cómo crear la PID_GTHR_DIRLINK_WITH_TIME adecuada.

Nota

ESTE CÓDIGO E INFORMACIÓN SE PROPORCIONA "TAL CUAL" SIN GARANTÍA DE NINGÚN TIPO, YA SEA EXPRESADO O IMPLÍCITO, INCLUYENDO, ENTRE OTROS, LAS GARANTÍAS IMPLÍCITAS DE COMERCIABILIDAD Y/O IDONEIDAD PARA UN PROPÓSITO DETERMINADO.

Copyright (C) Microsoft. Todos los derechos reservados.

 

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

Nota

Un componente IFilterde contenedor siempre debe enumerar todas las direcciones URL secundarias, incluso si las direcciones URL secundarias no han cambiado, ya que el indexador detecta eliminaciones a través del proceso de enumeración. Si la salida de fecha de un DIR_LINKS_WITH_TIME indica que los datos no han cambiado, el indexador no actualiza los datos de esa dirección URL.

 

La dirección URL física es la dirección URL que procesa el objeto UrlAccessor . Si el filtro no emite un DisplayUrl descriptivo, WDS muestra la dirección URL física al usuario como parte de los resultados de la búsqueda. El esquema WDS contiene dos propiedades para controlar lo que se muestra al usuario final, como se muestra en la tabla siguiente.

GUID PROPSPEC Descripción
D5CDD505-2E9C-101B-9397-08002B2CF9AE DisplayFolder Ruta de acceso de carpeta que se muestra al usuario en los resultados de la búsqueda
D5CDD505-2E9C-101B-9397-08002B2CF9AE FolderName Nombre para mostrar de la carpeta primaria

 

Si el código no emite displayFolder o FolderName, estos valores se calculan desde DisplayUrl. Las barras diagonales de la dirección URL indican contenedores dentro del sistema de archivos o del almacén.

Agregar funcionalidad de opciones de controlador de protocolo

Para que el controlador de protocolo tenga una página de inicio predeterminada (y la dirección URL del nodo de entrada), debe implementar la interfaz ISearchProtocolOptions . En versiones futuras de WDS, esta interfaz proporcionará enlaces al cuadro de diálogo Opciones para una experiencia de usuario mejorada. Esta interfaz proporciona la siguiente funcionalidad:

  • Determina si se cumplen los requisitos del controlador de protocolo. Por ejemplo, el almacén del controlador de protocolo puede requerir acceso a una aplicación determinada para indexar correctamente los datos de la aplicación, pero esa aplicación no está disponible.
  • Identifica los requisitos mínimos que el controlador de protocolo necesita para procesar un elemento. Los requisitos se pueden expresar en una descripción localizada y fácil de usar, como "Microsoft Outlook 2000 o superior".
  • Define las direcciones URL que el controlador de protocolo debe procesar de forma predeterminada.

ISearchProtocolOptions

En la tabla siguiente se describen los métodos que debe implementar para la interfaz ISearchProtocolOptions .

Método Descripción
CheckRequirements Determina si se cumplen los requisitos mínimos de un controlador de protocolo personalizado.
GetDefaultCrawlScope Devuelve una lista de direcciones URL predeterminadas dentro de un almacén especificado para un controlador de protocolo personalizado.
GetRequirements Identifica una descripción localizada y fácil de usar de los requisitos mínimos para un controlador de protocolo personalizado.

 

Referencia

Notificación del índice de cambios

Agregar iconos, vistas previas y menús contextuales con extensiones de shell

Instalación y registro de controladores de protocolo