Filterhandlers implementeren in Windows Search

Het is belangrijk dat u de vereiste DLL-structuur van een filterhandler begrijpt (een implementatie van de IFilter interface).

Dit onderwerp is als volgt ingedeeld:

De DLL-toegangspunten implementeren en exporteren

Elke IFilter DLL (aangeduid door Ifilter.dll in deze sectie) moet de volgende toegangspunten implementeren en exporteren. Deze toegangspunten worden meestal geëxporteerd met behulp van een moduledefinitiebestand (.def) voor de IFilter interface of met behulp van het __declspec(dllexport) trefwoord. Het DLL-bestand kan worden geregistreerd in elke map, maar bevindt zich meestal in de map %SystemRoot%\system32.

DLL-toegangspunten worden vermeld en beschreven in de volgende tabel.

DLL-naam DLL-beschrijving
DllRegisterServer Het DllRegisterServer toegangspunt registreert het DLL-bestand als filter in het register. U registreert het DLL-bestand door het regsvr32.exe programma uit te voeren met de naam van het DLL-bestand van de IFilter interface als argument: regsvr32.exe %SystemRoot%\system32\Ifilter.dll
dllUnregisterServer-functie De dllUnregisterServer-functie invoerpunt verwijdert het DLL-bestand als permanente handler in het register. U kunt de registratie van de DLL ongedaan maken door het programma regsvr32.exe uit te voeren met de optie /u: regsvr32.exe /u %SystemRoot%\system32\Ifilter.dll
dllGetClassObject-functie De inhoudsindexeringsclient roept het DllGetClassObject-functie toegangspunt aan via COM (Component Object Model) om een klassefabriekobject te maken voor de IFilter interface en om een pointer naar de klassefabriekinterface van dat object op te halen.
dllCanUnloadNow-functie De inhoudsindexeringsclient roept de DllCanUnloadNow-functie aan toegangspunt, via COM, om te bepalen of het mogelijk is om de IFilter DLL te verwijderen. De IFilter-interface wordt verwijderd nadat deze gedurende een periode niet is gebruikt, zoals opgegeven door de registerwaarde FilterIdleTimeOut.

De IFilter-klasse en klassefactory implementeren

Ten minste twee klassen, zoals CFilter en CFilterCF, worden doorgaans geïmplementeerd door elke IFilter DLL. De CFilter-klasse produceert het IFilter interfaceobject waarmee de functionaliteit voor inhoudsfiltering wordt geïmplementeerd. De lidfuncties implementeren de interfacemethoden van de IFilter interface. Elke IFilter--klasse vereist een unieke klasse-id (CLSID), die door de IFilter interface-implementeerfunctie wordt gegenereerd.

De CFilterCF-klasse produceert het klassefactoryobject voor de IFilter interface. De klassefactory wordt aangeroepen, via de IClassFactory Interface interface, door de DllGetClassObject-functie toegangspunt van het DLL-bestand. De CFilterCF-klasse maakt het CFilter-object en retourneert een aanwijzer naar IUnknown-. In complexere gevallen kan een IFilter- een klassehiërarchie implementeren in plaats van de enkele CFilter-klasse.

De COM-interfaces overnemen

Windows Search 3.0 en hoger vereisen dat u om de volgende redenen IPersistStream- gebruikt:

  • Om prestaties en toekomstige compatibiliteit te garanderen.
  • Om de beveiliging te verbeteren. IFilters die zijn geïmplementeerd met IPersistStream zijn veiliger omdat de context waarin de IFilter-interface wordt uitgevoerd, de rechten voor het openen van bestanden op de schijf of via het netwerk niet nodig heeft.
  • Hoewel Windows Search alleen IPersistStreamgebruikt, kan de interfaceklasse IFilter interface ook de IPersistFile Interface en/of IPersistStorage Interface-interface overnemen voor achterwaartse compatibiliteit.

Deze interfaces worden gedeclareerd in bestanden die zijn opgenomen uit de map mssdk\include en hebben vooraf gedefinieerde interface-id's (IID's). De client voor inhoudsindexering voert een query uit op de IFilter-interface via IUnknown- om te bepalen welke van deze interfaces moeten worden gebruikt bij het filteren van inhoud.

De COM-interfacemethoden implementeren

De IFilter-interface implementeert de IUnknown-methoden voor zowel de interface-klasse IFilter als de IFilter interface-klasse fabriek. De volgende tabel bevat in vtable-volgorde de IFilter interfacespecifieke interfaces en -methoden die de IFilter-interface moet implementeren. De IFilter-interface moet ten minste IPersistStream-implementeren, maar kan extra IPersist-afgeleide interfaces implementeren.

COM-interface Methode
IClassFactory-interface CreateInstance, LockServer
IClassFactory2-interface GetLicInfo, RequestLicKey, CreateInstanceLic
IFilter IFilter::Init, IFilter::GetChunk, IFilter::GetText, IFilter::GetValue, IFilter::BindRegion
IPersist Interface GetClassID
IPersistFile-interface IsDirty, Load, Save, SaveCompleted, GetCurFile
IPersistStorage-interface IsDirty, Load, Save, GetSizeMax
IPersistStream IsDirty, Load, Save, GetSizeMax

Op de referentiepagina voor elke methode worden de parameters en het functionele gedrag voor die methode opgegeven. Elke referentiepagina geeft ook de resultaatcodes die voor die methode moeten worden geïmplementeerd. De referentiepagina's voor de IFilter methoden geven de interfacespecifieke Codes in FACILITY_ITF resultaatcodes die moeten worden geïmplementeerd, en de client voor inhoudsindexering kan ook alle algemene resultaatcodes verwerken, zoals FACILITY_NULL en FACILITY_WIN32. Zie Structuur van COM-foutcodesvoor meer informatie.

COM-methoden die niet zijn geïmplementeerd

De IFilter-interface moet ten minste IPersistStream-implementeren, maar hoeft geen extra IPersist-afgeleide interfaces te implementeren.

Windows Search hoeft de COM-methoden die worden vermeld in de volgende tabel niet te implementeren.

Methode die niet vereist is Beschrijving
IPersistStream::IsDirty Filters moeten E_NOTIMPL retourneren.
IPersistStream::Save Filters moeten E_NOTIMPL retourneren.
IPersistStream::GetSizeMax Filters moeten E_NOTIMPL retourneren.
IFilter::BindRegion- Filters moeten E_NOTIMPL retourneren.

Aanvullende bronnen

Filterhandlers ontwikkelen

Het begrijpen van filterhandlers in Windows Search

aanbevolen procedures voor het maken van filterhandlers in Windows Search

eigenschappen retourneren van een filterhandler

Filterhandlers die met Windows worden meegeleverd

Filterhandlers Registreren

Filterhandlers testen