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.
È importante comprendere la struttura DLL richiesta di un gestore di filtri (un'implementazione dell'interfacciaIFilter).
Questo argomento è organizzato come segue:
- l'implementazione e l'esportazione dei punti di ingresso della DLL
- Implementazione della classe IFilter e della fabbrica di classi
- Ereditare le Interfacce COM
- Implementazione dei metodi di interfaccia COM
- risorse aggiuntive
- argomenti correlati
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:
- Per garantire prestazioni e compatibilità future.
- Per aumentare la sicurezza. IFilter implementati con IPersistStream sono più sicuri perché il contesto in cui viene eseguita l'interfacciaIFilternon richiede i diritti per aprire i file sul disco o in rete.
- Anche se Windows Search usa solo IPersistStream, la classe di interfacciaIFilterpuò anche ereditare l'interfaccia IPersistFile e/o implementazioni dell'interfaccia IPersistStorage per la compatibilità con le versioni precedenti.
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
- 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
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