Implementazione di un gestore del 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 usare invece Windows Search .
La creazione di un gestore di protocolli prevede l'implementazione di ISearchProtocol per gestire gli oggetti UrlAccessor, IUrlAccessor per generare metadati e per identificare i filtri appropriati per gli elementi nell'archivio dati, IProtocolHandlerSite per creare un'istanza di un oggetto SearchProtocol e identificare 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.
Queste sezioni contengono gli argomenti seguenti:
- Nota sugli URL
- Interfacce del gestore del protocollo
- IFilters for Containers
- Aggiunta di funzionalità opzioni del gestore del protocollo
- Argomenti correlati
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 al database o sul Web. Un URL che definisce un nodo di voce viene chiamato una pagina iniziale; WDS inizia a tale pagina iniziale e esegue la ricerca per indicizzazione ricorsiva dell'archivio dati. La struttura di 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 questa convenzione di denominazione: companyName.scheme.
Interfacce del gestore del protocollo
ISearchProtocol
L'interfaccia ISearchProtocol richiama, inizializza e gestisce gli oggetti UrlAccessor. Per altre informazioni sull'implementazione dell'interfaccia ISearchProtocol, vedere Informazioni di riferimento sull'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 creato 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 del gestore del protocollo, ad esempio convalidare l'URL per un elemento a cui si accede o controllare l'ultima volta modificata per determinare se un file deve essere elaborato nella ricerca per indicizzazione corrente.
Nota
I tempi 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 che può enumerare il contenuto. Un'altra distinzione tra gestori di protocolli gerarchici e basati su collegamento è l'uso del metodo IsDirectory. Nei gestori di protocolli basati su collegamenti, questo metodo deve restituire S_FALSE. I gestori di protocolli gerarchici devono restituire S_OK per i contenitori.
Per altre istruzioni sull'implementazione di un'interfaccia IUrlAccessor , vedere riferimento all'interfaccia IUrlAccessor .
IProtocolHandlerSite
Questa interfaccia viene usata per creare un'istanza di un oggetto SearchProtocol e fornisce anche l'oggetto UrlAccessor con un filtro appropriato per un ID di classe specificato (CLSID).
IFilters for Containers
Se si implementa un gestore del protocollo gerarchico, è necessario implementare un componente IFiltercontenitore che enumera GLI URL che rappresentano contenitori o cartelle. Il processo di enumerazione è un ciclo attraverso i metodi GetChunk e GetValue dell'interfaccia IFilter che restituiscono un elenco di URL che rappresentano ogni elemento nel contenitore.
In primo luogo, GetChunk restituisce un oggetto FULLPROSPEC con il set di proprietà GATHER_PROPSET e uno dei due:
- PID_GTHR_DIRLINK, l'URL dell'elemento senza l'ultima volta modificata o
- PID_GTHR_DIRLINK_WITH_TIME, l'URL insieme all'ultima ora modificata
Il GUID impostato 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-GetLastModified>>().
GetValue restituisce quindi un VALORE PROPVARIANT per l'URL (e l'ora dell'ultima modifica se usata), come segue:
- VT_LPWSTR, l'URL dell'elemento figlio o
- Vettore dell'URL seguito da UN FILETIME
Il codice di esempio seguente illustra come compilare la PID_GTHR_DIRLINK_WITH_TIME appropriata.
Nota
QUESTO CODICE E INFORMAZIONI VENGONO FORNITE "COME È" SENZA GARANZIA DI ALCUN TIPO, ESPRESSO O IMPLICITO, INCLUSO MA NON LIMITATO ALLE GARANZIE IMPLICITE DI COMMERCIABILITÀ E/O IDONEITÀ PER UNO SCOPO SPECIFICO.
Copyright (C) Microsoft. Tutti i diritti sono 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 componente IFilterdel contenitore deve 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 l'output della data in un DIR_LINKS_WITH_TIME indica che i dati non sono stati modificati, l'indicizzatore non aggiorna i dati per tale URL.
L'URL fisico è l'URL elaborato dall'oggetto UrlAccessor . 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 cosa viene visualizzato all'utente finale, come illustrato nella tabella seguente.
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 padre |
Se il codice non genera un oggetto DisplayFolder o FolderName, questi valori vengono calcolati da DisplayUrl. Le barre in avanti nell'URL indicano contenitori all'interno dell'archivio o del file system.
Aggiunta di funzionalità opzioni del gestore del protocollo
Per consentire al gestore del protocollo di avere una pagina iniziale predefinita (e l'URL del nodo di ingresso), è necessario implementare l'interfaccia ISearchProtocolOptions . Nelle versioni future di WDS, questa interfaccia fornirà gli 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 può richiedere l'accesso a un'applicazione specifica 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 localizzata e descrittiva, ad esempio "Microsoft Outlook 2000 o versione successiva".
- Definisce gli URL che il gestore del protocollo deve elaborare per impostazione predefinita.
ISearchProtocolOptions
La tabella seguente descrive i metodi da implementare per l'interfaccia ISearchProtocolOptions .
Metodo | Descrizione |
---|---|
CheckRequirements | Determina se vengono soddisfatti i requisiti minimi di un gestore del protocollo personalizzato |
GetDefaultCrawlScope | Restituisce un elenco di URL predefiniti all'interno di un archivio specificato per un gestore del protocollo personalizzato |
GetRequirements | Identifica una descrizione descrittiva e localizzata dei requisiti minimi per un gestore di protocolli personalizzati |
Argomenti correlati