Implementazione di gestori di filtri in Windows Search

È importante comprendere la struttura DLL richiesta di un gestore di filtri (un'implementazione dell'interfacciaIFilter).

Questo argomento è organizzato come segue:

Implementazione ed esportazione dei punti di ingresso della DLL

Ogni IFilter DLL (indicato da Ifilter.dll in questa sezione) deve implementare ed esportare i punti di ingresso seguenti. Questi punti di ingresso vengono in genere esportati usando un file di definizione del modulo (def) per l'interfaccia IFilter o usando la parola chiave __declspec(dllexport). Il file DLL può essere registrato in qualsiasi cartella, ma in genere si trova nella cartella %SystemRoot%\system32.

I punti di ingresso della DLL sono elencati e descritti nella tabella seguente.

Nome DLL Descrizione dll
DllRegisterServer Il DllRegisterServer punto di ingresso registra la DLL come filtro nel Registro di sistema. Per registrare la DLL, esegui il programma di regsvr32.exe con il nome del file DLL dell'interfaccia IFilter come argomento: regsvr32.exe %SystemRoot%\system32\Ifilter.dll
Funzione DllUnregisterServer La funzione DllUnregisterServer come punto di ingresso rimuove la DLL come gestore permanente nel registro. Devi annullare la registrazione della DLL eseguendo il programma regsvr32.exe con il flag /u: regsvr32.exe /u %SystemRoot%\system32\Ifilter.dll
Funzione DllGetClassObject Il client di indicizzazione del contenuto chiama la funzione DllGetClassObject punto di ingresso, tramite Component Object Model (COM), per creare un oggetto class factory per l'interfaccia IFilter e ottenere un puntatore all'interfaccia class factory di tale oggetto.
Funzione DllCanUnloadNow Il client di indicizzazione del contenuto chiama, tramite COM, la funzione DllCanUnloadNow al punto di ingresso per determinare se è possibile scaricare la DLL IFilter. L'interfaccia IFilter viene scaricata dopo che non è usata per un intervallo di tempo, come specificato dal valore del Registro di sistema FilterIdleTimeOut.

Implementazione della classe IFilter e della class factory

Almeno due classi, ad esempio CFilter e CFilterCF, vengono in genere implementate da ogni IFilter DLL. La classe CFilter produce l'oggetto interfaccia IFilter che implementa la funzionalità di filtro del contenuto. Le funzioni membro implementano i metodi di interfaccia dell'interfaccia IFilter. Ogni classe IFilter richiede un identificatore di classe univoco (CLSID), generato dall'implementatore dell'interfaccia IFilter.

La classe CFilterCF produce l'oggetto class-factory per l'interfaccia IFilter. La class factory viene chiamata, tramite l'interfaccia IClassFactory, dalla funzione DllGetClassObject punto di ingresso della DLL. La classe CFilterCF crea l'oggetto CFilter e restituisce un puntatore a IUnknown. In casi più complessi, un IFilter può implementare una gerarchia di classi al posto della singola classe CFilter.

Ereditarietà delle interfacce COM

Windows Search 3.0 e versioni successive richiedono di usare IPersistStream per i motivi seguenti:

Queste interfacce vengono dichiarate nei file inclusi nella directory mssdk\include e hanno identificatori di interfaccia predefiniti (IID). Il client di indicizzazione del contenuto esegue una query sull'interfaccia IFilter tramite IUnknown per determinare quale di queste interfacce utilizzare durante il filtraggio del contenuto.

Implementazione dei metodi di interfaccia COM

L'interfaccia IFilter implementa i metodi di IUnknown sia per la classe di interfaccia IFilter che per la factory dell'interfaccia-classe IFilter. Nella tabella seguente sono elencati, nell'ordine della tabella vtable, le interfacce e i metodi specifici dell'interfaccia IFilter che devono essere implementati dall'interfaccia IFilter. L'interfaccia IFilter deve implementare almeno IPersistStream, ma può implementare interfacce aggiuntive derivate da IPersist.

Interfaccia COM Metodo
Interfaccia IClassFactory CreateInstance, LockServer
Interfaccia IClassFactory2 GetLicInfo, RequestLicKey, CreateInstanceLic
IFilter IFilter::Init, IFilter::GetChunk, IFilter::GetText, IFilter::GetValue, IFilter::BindRegion
interfaccia IPersist GetClassID (Ottieni l'ID della Classe)
Interfaccia IPersistFile IsDirty, Load, Save, SaveCompleted, GetCurFile
interfaccia IPersistStorage IsDirty, Load, Save, GetSizeMax
IPersistStream IsDirty, Load, Save, GetSizeMax

La pagina di riferimento per ogni metodo specifica i parametri e il comportamento funzionale per tale metodo. Ogni pagina di riferimento fornisce anche i codici dei risultati da implementare per tale metodo. Le pagine di riferimento per i metodi IFilter forniscono i Codici specifici dell'interfaccia nei codici dei risultati FACILITY_ITF da implementare. Inoltre, il client di indicizzazione del contenuto può gestire anche uno qualsiasi dei codici di risultato generici, come FACILITY_NULL e FACILITY_WIN32. Per altre informazioni, vedere Struttura dei codici di errore COM.

Metodi COM non implementati

L'interfacciaIFilterdeve implementare almeno IPersistStream, ma non deve implementare interfacce aggiuntive derivate da IPersist.

Windows Search non deve implementare i metodi COM elencati nella tabella seguente.

Metodo non obbligatorio Descrizione
IPersistStream::IsDirty I filtri devono restituire E_NOTIMPL.
IPersistStream::Save I filtri devono restituire E_NOTIMPL.
IPersistStream::GetSizeMax I filtri devono restituire E_NOTIMPL.
IFilter::BindRegion I filtri devono restituire E_NOTIMPL.

Risorse aggiuntive

Sviluppo dei Gestori di Filtri

Informazioni sui gestori di filtri in Windows Search

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

Restituzione di Proprietà da un Gestore di Filtri

Gestori dei filtri forniti con Windows

registrazione dei gestori di filtri

test dei gestori di filtri