Condividi tramite


Implementazione di un gestore di protocollo per WDS

Nota

Windows Desktop Search 2.x è una tecnologia obsoleta originariamente disponibile come componente aggiuntivo per Windows XP e Windows Server 2003. Nelle versioni successive, utilizzare Windows Search invece.

La creazione di un gestore di protocolli comporta l'implementazione di ISearchProtocol per gestire gli oggetti UrlAccessor, IUrlAccessor per generare metadati su e per identificare i filtri appropriati per gli elementi nell'archivio dati, IProtocolHandlerSite per creare un'istanza di un oggetto SearchProtocol e identificare i filtri appropriati e IFilterper filtrare i file proprietari o per enumerare e filtrare i file archiviati in modo gerarchico. Il gestore del protocollo deve essere multithreading.

In questa sezione sono inclusi gli argomenti seguenti:

Nota sugli URL

Microsoft Windows Desktop Search (WDS) usa GLI URL per identificare in modo univoco gli elementi in un file system, all'interno di un archivio simile a un database o sul Web. Un URL che definisce un nodo di immissione viene chiamato pagina iniziale; WdS inizia in corrispondenza di tale pagina iniziale e esegue una ricerca per indicizzazione ricorsiva nell'archivio dati. La struttura dell'URL tipica è:

protocol://host/path/name.extension

Nota

Quando si vuole aggiungere un nuovo archivio dati, è necessario selezionare un nome per identificarlo che non è in conflitto con quelli correnti. È consigliabile usare questa convenzione di denominazione: companyName.scheme.

 

Interfacce del gestore del protocollo

ISearchProtocol

L'interfacciaISearchProtocolrichiama, inizializza e gestisce gli oggetti UrlAccessor. Per altre informazioni sull'implementazione dell'interfaccia ISearchProtocol, vedere Riferimento all'interfaccia ISearchProtocol.

IUrlAccessor

Per un URL specificato, l'interfaccia IUrlAccessor genera metadati sulla struttura della posizione e sugli elementi contenuti e associa tali elementi a un filtro. L'oggetto IUrlAccessor viene istanziato e inizializzato da un oggetto SearchProtocol; tuttavia, è anche possibile implementare un metodo di inizializzazione interno in modo che l'oggetto IUrlAccessor possa eseguire attività di inizializzazione specifiche per il gestore del protocollo, come convalidare l'URL di un elemento a cui si accede o controllare l'orario dell'ultima modifica per determinare se un file deve essere elaborato nella ricerca per indicizzazione corrente.

Nota

Gli orari modificati per le directory vengono ignorati. L'oggetto IUrlAccessor deve enumerare gli oggetti figlio per determinare se sono state apportate modifiche o eliminazioni.

 

Gran parte della progettazione dell'oggetto UrlAccessor dipende dal fatto che la struttura sia gerarchica o basata su collegamento. Per gli archivi dati gerarchici, l'oggetto UrlAccessor deve trovare un filtro in grado di enumerare il contenuto. Un'altra distinzione tra gestori di protocollo gerarchici e basati su collegamento è l'uso del metodo IsDirectory. Nei gestori di protocollo basati su collegamento questo metodo deve restituire S_FALSE. I gestori di protocolli gerarchici devono restituire S_OK per i contenitori.

Per ulteriori istruzioni sull'implementazione di un'interfaccia IUrlAccessor, vedere il riferimento all'interfaccia IUrlAccessor.

IProtocolHandlerSite

Questa interfaccia viene utilizzata per creare un'istanza di un oggetto SearchProtocol e fornisce anche all'oggetto UrlAccessor un filtro appropriato per un ID classe specificato (CLSID).

Filtri IFilter per contenitori

Se si implementa un gestore di protocollo gerarchico, è necessario implementare un contenitore componente IFilterche enumera gli URL che rappresentano contenitori o cartelle. Il processo di enumerazione è un ciclo tra i metodi GetChunk e GetValue dell'interfaccia IFilter, che restituiscono un elenco di URL rappresentanti ogni elemento nel contenitore.

Prima di tutto, GetChunk restituisce un oggetto FULLPROSPEC con il set di proprietà GATHER_PROPSET e uno dei due elementi seguenti:

  • PID_GTHR_DIRLINK, l'URL dell'elemento senza l'ora dell'ultima modifica o
  • PID_GTHR_DIRLINK_WITH_TIME, l'URL insieme all'ora dell'ultima modifica

Il GUID del set di proprietà per GATHER_PROPSET è 0B63E343-9CCC-11D0-BCDB-00805FCCCE04. La proprietà PROPSPEC è PID_GTHR_DIRLINK=2 o PID_GTHR_DIRLINK_WITH_TIME = 12 decimali.

La restituzione di PID_GTHR_DIRLINK_WITH_TIME è più efficiente perché l'indicizzatore può determinare immediatamente se l'elemento deve essere indicizzato senza chiamare i metodi ISearchProtocol->CreateUrlAccessor() e IUrlAccessor->i metodi GetLastModified().

Quindi GetValue restituisce un oggetto di tipo PROPVARIANT per l'URL (e, se utilizzata, l'ora dell'ultima modifica), nei seguenti modi:

  • VT_LPWSTR, l'URL dell'elemento figlio o
  • Vettore dell'URL seguito da un FILETIME

Il codice di esempio seguente illustra come compilare il PID_GTHR_DIRLINK_WITH_TIME appropriato.

Nota

QUESTO CODICE E LE INFORMAZIONI VENGONO FORNITE "COSÌ COM'È" SENZA GARANZIA DI ALCUN TIPO, ESPRESSA O IMPLICITA, INCLUSA, MA NON LIMITATA ALLE GARANZIE IMPLICITE DI COMMERCIABILITÀ E/O IDONEITÀ PER UNO SCOPO SPECIFICO.

Copyright (C) Microsoft. Tutti i diritti riservati.

 

// 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 contenitore componente IFilterdeve sempre enumerare tutti gli URL figlio anche se gli URL figlio non sono stati modificati, perché l'indicizzatore rileva le eliminazioni tramite il processo di enumerazione. Se la data di output in un DIR_LINKS_WITH_TIME indica che i dati non sono stati modificati, l'indicizzatore non aggiornerà i dati per tale URL.

 

L'URL fisico è l'URL elaborato dall'UrlAccessor oggetto. Se il filtro non genera un DisplayUrl descrittivo, WDS visualizza l'URL fisico all'utente come parte dei risultati della ricerca. Lo schema WDS contiene due proprietà per controllare ciò che viene visualizzato all'utente finale, come illustrato nella tabella seguente.

Identificatore Unico Globale (GUID) PROPSPEC Descrizione
D5CDD505-2E9C-101B-9397-08002B2CF9AE DisplayFolder Percorso cartella visualizzato all'utente nei risultati della ricerca
D5CDD505-2E9C-101B-9397-08002B2CF9AE FolderName Nome visualizzato della cartella principale

 

Se il codice non genera displayFolder o FolderName, questi valori vengono calcolati da DisplayUrl. Le barre nell'URL indicano i contenitori all'interno dell'archivio o del file system.

Aggiunta di funzionalità per le opzioni di gestione dei protocolli

Affinché il gestore del protocollo abbia una pagina iniziale predefinita (e l'URL del nodo di ingresso), è necessario implementare l'interfaccia ISearchProtocolOptions. Nelle versioni future di WDS, questa interfaccia fornirà hook alla finestra di dialogo Opzioni per un'esperienza utente avanzata. Questa interfaccia offre le funzionalità seguenti:

  • Determina se vengono soddisfatti i requisiti per il gestore del protocollo. Ad esempio, l'archivio del gestore del protocollo potrebbe richiedere l'accesso a una determinata applicazione per indicizzare correttamente i dati dell'applicazione, ma tale applicazione non è disponibile.
  • Identifica i requisiti minimi necessari per il gestore del protocollo per elaborare un elemento. I requisiti possono essere espressi in una descrizione descrittiva e localizzata, ad esempio "Microsoft Outlook 2000 o versione successiva".
  • Definisce gli URL che il gestore del protocollo deve elaborare per impostazione predefinita.

ISearchProtocolOptions

Nella tabella seguente vengono descritti i metodi da implementare per l'interfaccia ISearchProtocolOptions.

Metodo Descrizione
VerificaRequisiti Determina se vengono soddisfatti i requisiti minimi di un gestore di protocolli personalizzato
GetDefaultCrawlScope Restituisce un elenco di URL predefiniti all'interno di un archivio specificato per un gestore di protocolli personalizzato
GetRequirements Identifica una descrizione descrittiva e localizzata dei requisiti minimi per un gestore di protocolli personalizzato

 

Riferimento

notifica dell'indice delle modifiche

Aggiunta di icone, anteprime e menu di scelta rapida con estensioni shell

l'installazione e la registrazione dei gestori di protocollo