Share via


Informazioni sui gestori di filtri in Windows Search

Gestori di filtri, che sono implementazioni dell'interfaccia IFilter , analizzano i documenti per il testo e le proprietà. I gestori di filtri estraggono blocchi di testo da questi elementi, filtrando la formattazione incorporata e conservando le informazioni sulla posizione del testo. Estraono anche blocchi di valori, ovvero proprietà del documento. IFilter è la base per la creazione di applicazioni di livello superiore, ad esempio indicizzatori di documenti e visualizzatori indipendenti dall'applicazione.

Questo argomento è organizzato come segue:

Informazioni sull'interfaccia IFilter

Microsoft Windows Search usa filtri per estrarre il contenuto degli elementi per l'inclusione in un indice full-text. È possibile estendere Windows Search ai tipi di file nuovi o proprietari scrivendo filtri per estrarre il contenuto e i gestori delle proprietà per estrarre le proprietà dei file.

L'interfaccia IFilter è progettata per soddisfare le esigenze specifiche dei motori di ricerca full-text. I motori di ricerca full-text come Windows Search chiamano i metodi IFilter per estrarre informazioni di testo e proprietà e aggiungerle a un indice. Windows Search interrompe i risultati del metodo IFilter::GetText restituito in parole, li normalizza e li salva in un indice. Se disponibile, il motore di ricerca usa l'identificatore del codice del linguaggio (LCID) di un blocco di testo per eseguire interruzioni e normalizzazione della parola specifiche del linguaggio.

Windows Search usa tre funzioni, descritte nella tabella seguente, per accedere ai gestori di filtri registrati (implementazioni dell'interfaccia IFilter ). Queste funzioni sono particolarmente utili quando si caricano e si associano al gestore di filtri di un oggetto incorporato.

Funzione Descrizione
LoadIFilter Ottiene un puntatore al filtro IFilter più adatto per il tipo di contenuto specificato.
BindIFilterFromStorage Ottiene un puntatore al filtro IFilter più adatto per il contenuto contenuto contenuto in un oggetto IStorage Interface .
BindIFilterFromStream Ottiene un puntatore a IFilter più adatto per un identificatore di classe specificato (CLSID) recuperato da una variabile di flusso.

L'interfaccia IFilter include cinque metodi, descritti nella tabella seguente.

Metodo Descrizione
IFilter::Init Inizializza una sessione di filtro.
IFilter::GetChunk Posiziona IFilter all'inizio del primo blocco o successivo e restituisce un descrittore.
IFilter::GetText Recupera il testo dal blocco corrente.
IFilter::GetValue Recupera i valori dal blocco corrente.
IFilter::BindRegion Recupera un'interfaccia che rappresenta la parte specificata dell'oggetto. Riservato per utilizzi futuri.

Processo di isolamento

Windows Search esegue IFilter nel contesto di sicurezza del sistema locale con diritti limitati. In questo processo di isolamento host IFilter viene rimosso un numero di diritti:

  • Codice con restrizioni
  • Tutti
  • Locale
  • Interattività
  • Utenti autenticati
  • Utenti predefiniti
  • Identificatore di sicurezza degli utenti (SID)

La rimozione di questi diritti significa che l'interfaccia IFilter non ha accesso al sistema del disco o alla rete o a qualsiasi interfaccia utente o funzioni degli Appunti. Inoltre, il processo di isolamento viene eseguito in un oggetto processo che impedisce la creazione dei processi figlio e impone un limite di 100 MB sul set di lavoro. il processo di isolamento dell'host dell'interfaccia IFilter aumenta la stabilità della piattaforma di indicizzazione, a causa della possibilità di implementare correttamente filtri di terze parti.

Nota

I gestori di filtri devono essere scritti per gestire i buffer e lo stack correttamente. Tutte le copie di stringa devono disporre di controlli espliciti per proteggere gli overrun del buffer. È consigliabile verificare sempre la dimensione allocata del buffer. È consigliabile testare sempre le dimensioni dei dati rispetto alle dimensioni del buffer.

DLL IFilter

Ifilter Le DLL implementano l'interfaccia IFilter per consentire a un client di estrarre informazioni sul valore del testo e della proprietà da un tipo di file, una classe o un tipo percepito. Il processo di filtro di Windows Search SearchFilterHost.exe associa al filtro IFilter registrato per la classe, il tipo percepito o l'estensione del nome dell'elemento.

Struttura IFilter

Ogni IFilter è un file DLL che implementa un server COM (Component Object Model) in-process per fornire le funzionalità di filtro specificate. La figura seguente illustra la struttura complessiva di una tipica DLL IFilter . Un esempio più complesso potrebbe implementare più di una classe IFilter .

diagramma della struttura di una tipica dll ifilter

Codice nativo

I filtri devono essere scritti nel codice nativo a causa di potenziali problemi di versioni CLR (Common Language Runtime) con il processo in cui vengono eseguiti più componenti aggiuntivi. In Windows 7 e versioni successive e versioni successive, i filtri scritti nel codice gestito vengono bloccati in modo esplicito.

Ricerca dell'identificatore della classe IFilter

La classe della DLL IFilter viene registrata nella chiave del Registro di sistema PersistentHandler. Nell'esempio seguente, per i file HTML, viene illustrato come trovare la DLL IFilter per un documento HTML. Questo esempio segue la logica simile a quella usata dal sistema per trovare IFilter associato a un elemento.

  1. Verificare se l'estensione per il tipo di file che i filtri DLL hanno un persistentHandler registrato nella voce del Registro di sistema \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Lasciare che questa chiave sia Value1. Se la voce esiste già, passare al passaggio 4 di questa procedura e usare Value1 in tale chiave. I valori sono di tipo REG_SZ.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. In alternativa, se non è presente un gestore persistente registrato per l'estensione, trovare CLSID associato al tipo di documento nella voce del Registro di sistema \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Lasciare che questa chiave sia Value2.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                CLSID
                   {25336920-03F9-11CF-8FD0-00AA00686F13}
  1. Determinare se un persistentHandler è registrato per CLSID. Usando Value2 determinato nel passaggio 2, trovare PersistentHandler per la voce \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2. Lasciare che questa chiave sia Value3.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Determinare il GUID del gestore persistente IFilter . Usando Value1 e Value3, trovare il GUID del gestore persistente IFilter per il tipo di documento. Il valore nella voce del Registro di sistema \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 o 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> restituisce il GUID IFilter PersistentHandler per questo tipo di documento. Lasciare che questa chiave sia Value4. In questo esempio il GUID dell'interfaccia IFilter è 89BCB740-6119-101A-BCB7-00DD010655AF.
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             {EEC97550-47A9-11CF-B952-00AA0051FE20}
                 = HTML File Persistent Handler
                    Data type         REG_SZ
                        PersistentAddinsRegistered
                        {89BCB740-6119-101A-BCB7-00DD010655AF}

                    Data type         REG_SZ
                        default = {E0CA5340-4534-11CF-B952-00AA0051FE20}

Nota

In questo esempio la DLL IFilter per i documenti HTML è nlhtml.dll.

Identificatori di codice IFilter::GetChunk e Impostazioni locali

LCID di testo può cambiare all'interno di un singolo file. Ad esempio, il testo di un manuale di istruzioni può alternarsi tra inglese (en-us) e spagnolo (es) o il testo può includere una singola parola in una lingua diversa dalla lingua primaria. In entrambi i casi, il filtro IFilter deve iniziare un nuovo blocco ogni volta che l'LCID cambia. Poiché l'LCID viene usato per scegliere un word breaker appropriato, è molto importante identificarlo correttamente. Se IFilter non riesce a determinare le impostazioni locali del testo, dovrebbe restituire un LCID di zero con il blocco. La restituzione di un LCID pari a zero causa l'uso della tecnologia Rilevamento automatico lingua (LAD) di Windows Search per determinare l'ID delle impostazioni locali del blocco. Se Windows Search non riesce a trovare una corrispondenza, viene predefinito nelle impostazioni locali predefinite del sistema (chiamando la funzione Funzione GetSystemDefaultLocaleName ). Per altre informazioni, vedere IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATE e STAT_CHUNK.

Se si controlla il formato del file e attualmente non contiene informazioni sulle impostazioni locali, è necessario aggiungere una funzionalità utente per abilitare l'identificazione delle impostazioni locali appropriate. L'uso di un word breaker non corrispondente può causare una scarsa esperienza di query per l'utente. Per altre informazioni, vedere IWordBreaker.

Nota

I filtri sono associati ai tipi di file, come indicato dalle estensioni del nome file, dai tipi MIME o dai CLSID. Mentre un filtro può gestire più tipi di file, ogni tipo funziona con un solo filtro.

Risorse aggiuntive

Sviluppo di gestori di filtri

Procedure consigliate per la creazione di gestori di filtri in Windows Search

Restituzione di proprietà da un gestore di filtri

Gestori di filtri che vengono forniti con Windows

Implementazione dei gestori di filtri in Windows Search

Registrazione dei gestori di filtri

Test dei gestori di filtri