Installazione e registrazione di gestori di protocollo (Windows Search)
L'installazione di un gestore di protocolli comporta la copia delle DLL in un percorso appropriato nella directory Programmi e quindi la registrazione del gestore del protocollo tramite il Registro di sistema. L'applicazione di installazione può anche aggiungere regole radice e ambito di ricerca per definire un ambito di ricerca per indicizzazione predefinito per l'origine dati shell.
Questo argomento è organizzato come segue:
- Informazioni sugli URL
- Implementazione delle interfacce del gestore del protocollo
- Implementazione dei gestori di filtri per i contenitori
- Installazione e registrazione di un gestore di protocollo
- Verifica che gli elementi siano indicizzati
- Argomenti correlati
Informazioni sugli URL
Windows Search usa gli URL per identificare in modo univoco gli elementi nella gerarchia dell'origine dati shell. L'URL che rappresenta il primo nodo della gerarchia è denominato radice di ricerca; Windows Search inizierà l'indicizzazione nella radice di ricerca, richiedendo che il gestore del protocollo enumeri i collegamenti figlio per ogni URL.
La struttura dell'URL tipica è:
<protocol>:// [{user SID}/] <localhost>/<path>/[<ItemID>]
La sintassi dell'URL è descritta nella tabella seguente.
Sintassi | Descrizione |
---|---|
<protocol> | Identifica il gestore di protocollo da richiamare per l'URL. |
{USER SID} | Identifica il contesto di sicurezza utente in cui viene chiamato il gestore del protocollo. Se non viene identificato alcun identificatore di sicurezza utente (SID), il gestore del protocollo viene chiamato nel contesto di sicurezza del servizio di sistema. |
<path> | Definisce la gerarchia dell'archivio, in cui ogni barra ('/') è un separatore tra i nomi delle cartelle. |
<Itemid> | Rappresenta una stringa univoca che identifica l'elemento figlio, ad esempio il nome del file. |
L'indicizzatore di Windows Search taglia la barra finale dagli URL. Di conseguenza, non è possibile basarsi sull'esistenza di una barra finale per identificare una directory rispetto a un elemento. Il gestore del protocollo deve essere in grado di gestire questa sintassi url. Assicurarsi che il nome del protocollo selezionato per identificare l'origine dati shell non sia in conflitto con quelli correnti. È consigliabile usare questa convenzione di denominazione: companyName.scheme
.
Per altre informazioni sulla creazione di un'origine dati shell, vedere Implementazione delle interfacce oggetto cartella di base.
Implementazione delle interfacce del gestore del protocollo
La creazione di un gestore di protocolli richiede l'implementazione delle tre interfacce seguenti:
- ISearchProtocol per gestire gli oggetti UrlAccessor.
- IUrlAccessor per esporre le proprietà e identificare i filtri appropriati per gli elementi nell'origine dati shell.
- IFilter per filtrare i file proprietari o per enumerare e filtrare i file archiviati gerarchicamente.
Oltre alle tre interfacce obbligatorie elencate, le altre interfacce sono facoltative e si è liberi di implementare le interfacce facoltative più appropriate per l'attività.
ISearchProtocol e ISearchProtocol2
Le interfacce SearchProtocol inizializzano e gestiscono gli oggetti UrlAccessor del gestore del protocollo. L'interfaccia ISearchProtocol2 è un'estensione facoltativa di ISearchProtocol e include un metodo aggiuntivo per specificare altre informazioni sull'utente e sull'elemento.
IUrlAccessor, IUrlAccessor2, IUrlAccessor3 e IUrlAccessor4
Le interfacce IUrlAccessor sono descritte nella tabella seguente.
Interfaccia | Descrizione |
---|---|
IUrlAccessor | Per un URL specificato, l'interfaccia IUrlAccessor fornisce l'accesso alle proprietà dell'elemento esposto nell'URL. Può anche associare tali proprietà a un filtro specifico del gestore di protocollo, ovvero un filtro diverso da quello associato al nome del file. |
IUrlAccessor2 (facoltativo) | L'interfaccia IUrlAccessor2 estende IUrlAccessor con metodi che ottengono una tabella codici per le proprietà dell'elemento e il relativo URL di visualizzazione e che ottengono il tipo di elemento nell'URL (documento o directory). |
IUrlAccessor3 (facoltativo) | L'interfaccia IUrlAccessor3 estende IUrlAccessor2 con un metodo che ottiene una matrice di SID utente, consentendo all'host del protocollo di ricerca di rappresentare questi utenti per indicizzare l'elemento. |
IUrlAccessor4 (facoltativo) | L'interfaccia IUrlAccessor4 estende la funzionalità dell'interfaccia IUrlAccessor3 con un metodo che identifica se il contenuto dell'elemento deve essere indicizzato. |
L'oggetto UrlAccessor viene creata un'istanza e inizializzata da un oggetto SearchProtocol. Le interfacce IUrlAccessor forniscono l'accesso a informazioni importanti tramite i metodi descritti nella tabella seguente.
metodo | Descrizione |
---|---|
IUrlAccessor::GetLastModified | Restituisce l'ora dell'ultima modifica dell'URL. Se questa volta è più recente dell'ultima volta che l'indicizzatore ha elaborato questo URL, i gestori di filtro (implementazioni dell'interfaccia IFilter ) vengono chiamati per estrarre i dati modificati (possibilmente) per tale elemento. Gli orari modificati per le directory vengono ignorati. |
IUrlAccessor::IsDirectory | Identifica se l'URL rappresenta una cartella contenente URL figlio. |
IUrlAccessor::BindToStream | Esegue il binding a un'interfaccia IStream che rappresenta i dati di un file in un archivio dati personalizzato. |
IUrlAccessor::BindToFilter | Esegue il binding a un IFilter specifico del gestore di protocolli, che può esporre le proprietà per l'elemento. |
IUrlAccessor4::ShouldIndexItemContent | Identifica se il contenuto dell'elemento deve essere indicizzato. |
IProtocolHandlerSite
L'interfaccia IProtocolHandlerSite viene usata per creare un'istanza di un gestore di filtri, ospitato in un processo isolato. Il gestore di filtro appropriato viene ottenuto per un identificatore di classe persistente (CLSID), una classe di archiviazione documenti o un'estensione di file. Il vantaggio di chiedere al processo host di eseguire l'associazione a IFilter è che il processo host può gestire il processo di individuazione di un gestore di filtro appropriato e controllare la sicurezza coinvolta nella chiamata al gestore.
Implementazione dei gestori di filtri per i contenitori
Se si implementa un gestore di protocollo gerarchico, è necessario implementare un gestore di filtri per un contenitore che enumera gli URL figlio. Un gestore di filtri è un'implementazione dell'interfaccia IFilter . Il processo di enumerazione è un ciclo attraverso i metodi IFilter::GetChunk e IFilter::GetValue dell'interfaccia IFilter. Ogni URL figlio viene esposto come valore della proprietà.
IFilter::GetChunk restituisce le proprietà del contenitore. Per enumerare gli URL figlio, IFilter::GetChunk restituisce uno dei valori seguenti:
-
URL dell'elemento senza l'ora dell'ultima modifica. IFilter::GetValue restituisce un VALORE PROPVARIANT contenente l'URL figlio.
PKEY_Search_UrlToIndexWithModificationTime:
URL e ora dell'ultima modifica. IFilter::GetValue restituisce un PROPVARIANT contenente un vettore dell'URL figlio e l'ora dell'ultima modifica.
La restituzione di PKEY_Search_UrlToIndexWithModificationTime è più efficiente perché l'indicizzatore può determinare immediatamente se l'elemento deve essere indicizzato senza chiamare i metodi ISearchProtocol::CreateAccessor e IUrlAccessor::GetLastModified.
Nel codice di esempio seguente viene illustrato come restituire la proprietà PKEY_Search_UrlToIndexWithModificationTime .
Importante
Copyright (c) Microsoft Corporation. Tutti i diritti sono riservati.
// 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;
}
Nota
Un componente IFilter 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 PKEY_Search_UrlToIndexWithModificationTime indica che i dati non sono stati modificati, l'indicizzatore non aggiorna i dati per tale URL.
Installazione e registrazione di un gestore di protocollo
L'installazione dei gestori di protocollo comporta la copia delle DLL in un percorso appropriato nella directory Programmi e quindi la registrazione delle DLL. I gestori di protocollo devono implementare la registrazione automatica per l'installazione. L'applicazione di installazione può anche aggiungere una radice di ricerca e regole di ambito per definire un ambito di ricerca per indicizzazione predefinito per l'origine dati shell, illustrato in Verifica che gli elementi siano indicizzati alla fine di questo argomento.
Linee guida per la registrazione di un gestore di protocolli
Quando si registra un gestore di protocollo, seguire queste linee guida:
- Il programma di installazione deve usare il programma di installazione EXE o MSI.
- È necessario specificare le note sulla versione.
- È necessario creare una voce Installazione applicazioni per ogni componente aggiuntivo installato.
- Il programma di installazione deve assumere tutte le impostazioni del Registro di sistema per il tipo di file specifico o archiviare che il componente aggiuntivo corrente riconosce.
- Se un componente aggiuntivo precedente viene sovrascritto, il programma di installazione deve inviare una notifica all'utente.
- Se un componente aggiuntivo più recente ha sovrascritto il componente aggiuntivo precedente, dovrebbe essere possibile ripristinare la funzionalità del componente aggiuntivo precedente e renderlo nuovamente il componente aggiuntivo predefinito per quel tipo di file.
- Il programma di installazione deve definire un ambito di ricerca per indicizzazione predefinito per l'indicizzatore aggiungendo una radice di ricerca e regole di ambito usando Gestione ambito ricerca per indicizzazione (CSM).
Registrazione di un gestore di protocolli
È necessario creare quattordici voci nel Registro di sistema per registrare il componente del gestore del protocollo, dove:
- Ver_Ind_ProgID è il ProgID indipendente dalla versione dell'implementazione del gestore del protocollo.
- Ver_Dep_ProgID è il ProgID dipendente dalla versione dell'implementazione del gestore del protocollo.
- CLSID_1 è il CLSID dell'implementazione del gestore del protocollo.
Per registrare un gestore di protocolli:
Registrare la versione indipendente ProgID con le chiavi e i valori seguenti:
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>
Registrare il ProgID dipendente dalla versione con le chiavi e i valori seguenti:
HKEY_CLASSES_ROOT <Ver_Dep_ProgID> (Default) = <Protocol Handler Class Description>
HKEY_CLASSES_ROOT <Ver_Dep_ProgID> CLSID (Default) = {CLSID_1}
Registrare il CLSID del gestore del protocollo con le chiavi e i valori seguenti:
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>
Registrare il gestore del protocollo con Windows Search. Nell'esempio seguente Nome <protocollo> è il nome del protocollo stesso, ad esempio file, mapi e così via:
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>
Prima di Windows Vista:
HKEY_CURRENT_USER SOFTWARE Microsoft Windows Desktop Search DS Index ProtocolHandlers <Protocol Name> HasRequirements = dword:00000000 HasStartPage = dword:00000000
Registrazione del gestore di tipi di file del gestore del protocollo
È necessario creare due voci nel Registro di sistema per registrare il gestore di tipi di file del gestore del protocollo (noto anche come estensione shell).
-
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Explorer Desktop NameSpace {CLSID of PH Implementation} (Default) = <Shell Implementation Description>
-
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Explorer Shell Extensions Approved {CLSID of PH Implementation} = <Shell Implementation Description>
Verifica che gli elementi siano indicizzati
Dopo aver implementato il gestore del protocollo, è necessario specificare quali elementi della shell devono essere indicizzati dal gestore del protocollo. È possibile usare Gestione cataloghi per avviare nuovamente l'indicizzazione . Per altre informazioni, vedere Uso di Gestione cataloghi. In alternativa, è anche possibile usare Gestione ambito ricerca per indicizzazione (CSM) per configurare le regole predefinite che indicano gli URL per cui l'indicizzatore deve eseguire la ricerca per indicizzazione. Per altre informazioni, vedere Uso di Gestione ambito ricerca per indicizzazione e Gestione delle regole di ambito. È anche possibile aggiungere una radice di ricerca (per altre informazioni, vedere Gestione delle radici della ricerca). Un'altra opzione disponibile consiste nel seguire la procedura descritta nell'esempio ReIndex negli esempi di codice di Windows Search.
L'interfaccia ISearchCrawlScopeManager fornisce metodi che notificano al motore di ricerca di contenitori di eseguire ricerche per indicizzazione e/o espressioni di controllo e gli elementi in tali contenitori da includere o escludere durante la ricerca per indicizzazione o il controllo. In Windows 7 e versioni successive ISearchCrawlScopeManager2 estende ISearchCrawlScopeManager con il metodo ISearchCrawlScopeManager2::GetVersion che ottiene la versione, che informa i client se lo stato del CSM è stato modificato.
Argomenti correlati
-
Concettuale
-
Esempio di codice: Estensioni della shell per gestori di protocollo
-
Creazione di un Connessione or di ricerca per un gestore del protocollo