Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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
- Ricerca dell'identificatore della classe IFilter
- risorse aggiuntive
- argomenti correlati
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.
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.
- 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 usareValue1nella chiave. I valori sono di tipo REG_SZ.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- 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}
- Determinare se un oggetto PersistentHandler è registrato per il CLSID. Usando
Value2determinato nel passaggio 2, trovare il PersistentHandler per la voce \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2. Lasciare che questa chiave siaValue3.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- Determinare il GUID del gestore persistente IFilter. Usando
Value1eValue3, 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 siaValue4. 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
- L'esempio di codice IFilterSample, disponibile in GitHub, illustra come creare una classe di base IFilter per implementare l'interfacciaIFilter.
- Per una panoramica del processo di indicizzazione, vedere Processo di indicizzazione.
- Per una panoramica dei tipi di file, vedere tipi di file.
- Per eseguire query sugli attributi di associazione di file per un tipo di file, vedere PerceivedTypes, SystemFileAssociations e Application Registration.
Argomenti correlati
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