Informazioni sui gestori di filtri in Windows Search

Gestori di filtro, che sono implementazioni dell'interfaccia IFilter, scansionano i documenti per il testo e le proprietà. I gestori di filtro estraggono blocchi di testo da questi elementi, filtrando la formattazione incorporata e mantenendo le informazioni sulla posizione del testo. Estraggono 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 da includere in un indice full-text. Puoi estendere Windows Search per indicizzare i tipi di file nuovi o proprietari scrivendo filtri per estrarre il contenuto e i gestori di proprietà per estrarre le proprietà dei file.

L'interfacciaIFilterè 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::GetTextrestituito in parole, li normalizza e li salva in un indice. Se disponibile, il motore di ricerca usa l'identificatore del codice di lingua (LCID) di un blocco di testo per eseguire interruzioni di parole e normalizzazione specifiche della lingua.

Windows Search usa tre funzioni, descritte nella tabella seguente, per accedere ai gestori di filtri registrati (implementazioni dell'interfacciaIFilter). Queste funzioni sono particolarmente utili durante il caricamento e l'associazione a un gestore di filtro di un oggetto incorporato.

Funzione Descrizione
LoadIFilter Ottiene un puntatore all'IFilter più adatto per il tipo di contenuto specificato.
BindIFilterFromStorage Ottiene un puntatore al IFilter più adatto per il contenuto contenuto in un oggetto Interfaccia IStorage .
BindIFilterFromStream Ottiene un puntatore al IFilter più adatto per un identificatore di classe specificato (CLSID) ottenuto 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 uso futuro.

Processo di isolamento

Windows Search esegue IFilters nel contesto di sicurezza del sistema locale con diritti limitati. In questo processo di isolamento dell'host IFilter , vengono rimossi alcuni diritti:

  • Codice con restrizioni
  • Tutti
  • Locale
  • Interattivo
  • Utenti autenticati
  • Utenti predefiniti
  • ID di sicurezza degli utenti (SID)

La rimozione di questi diritti significa che l'interfacciaIFilternon 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 con un oggetto di lavoro che impedisce la creazione di processi figlio e impone un limite di 100 MB al working set. il processo di isolamento dell'host dell'interfaccia IFilter aumenta la stabilità della piattaforma di indicizzazione, a causa della possibilità di implementare in modo non corretto filtri di terze parti.

Nota

I gestori di filtro devono essere scritti per gestire correttamente i buffer e lo stack. Tutte le copie di stringa devono disporre di controlli espliciti per evitare sovraccarichi del buffer. È sempre necessario verificare le dimensioni allocate del buffer. È consigliabile testare sempre le dimensioni dei dati rispetto alle dimensioni del buffer.

DLL IFilter

IFilter DLL implementano l'interfaccia IFilter per consentire a un client di estrarre informazioni sul testo e sul valore delle proprietà da un tipo di file, una classe o un tipo percepito. Il processo di filtro di Windows Search SearchFilterHost.exe viene associato all'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 un tipico DLL IFilter. Un esempio più complesso può implementare più di un classe IFilter.

diagramma della struttura di una dll ifilter tipica

Codice nativo

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

Ricerca dell'identificatore di classe IFilter

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

  1. Controllare se l'estensione per il tipo di file che i filtri DLL trattano ha 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 direttamente al passaggio 4 di questa procedura e usare Value1 nella 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 PersistentHandler registrato per l'estensione, trovare il 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 oggetto PersistentHandler è registrato per il CLSID. Usando Value2 determinato nel passaggio 2, trovare il 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, trova il GUID del gestore persistente IFilter per il tipo di documento. Il valore nella voce del Registro \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 DLLIFilterper i documenti HTML è nlhtml.dll.

Identificatori del codice IFilter::GetChunk e delle impostazioni locali

L'LCID di testo può cambiare all'interno di un singolo file. Ad esempio, il testo di un manuale di istruzioni potrebbe alternare l'inglese (en-us) e lo spagnolo (es) o il testo può includere una singola parola in una lingua diversa dalla lingua primaria. In entrambi i casi, l'IFilterdeve iniziare un nuovo blocco ogni volta che cambia LCID. Poiché l'LCID viene usato per scegliere un word breaker appropriato, è molto importante identificarlo correttamente. Se il IFilter non è in grado di determinare la lingua del testo, dovrebbe restituire un LCID pari a zero con il blocco. Se si restituisce un LCID pari a zero, Windows Search utilizza la tecnologia di rilevamento automatico della lingua (LAD) per determinare l'ID della locale del blocco. Se Windows Search non riesce a trovare una corrispondenza, per impostazione predefinita viene utilizzata la localizzazione predefinita del sistema (chiamando la funzione GetSystemDefaultLocaleName). Per altre informazioni, vedere IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATEe STAT_CHUNK.

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

Nota

I filtri sono associati ai tipi di file, come indicato dalle estensioni di 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 delle Proprietà da un Gestore di Filtri

gestori di filtri forniti con Windows

Implementazione di gestori di filtri in Windows Search

registrazione dei gestori di filtri

Test handler dei filtri