Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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
- De IFilter-klasse en klassefabriek implementeren
- COM-interfaces erven
- de COM-interfacemethoden implementeren
- Aanvullende bronnen
- Verwante onderwerpen
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
- Het codevoorbeeld IFilterSample, beschikbaar op GitHub-, laat zien hoe u een IFilter-basisklasse maakt voor het implementeren van de IFilter--interface.
- Zie Het indexeringsprocesvoor een overzicht van het indexeringsproces.
- Zie Bestandstypenvoor een overzicht van bestandstypen.
- Zie PerceivedTypes, SystemFileAssociations en Application Registrationals u een query wilt uitvoeren op kenmerken van bestandskoppelingen voor een bestandstype.
Verwante onderwerpen
Het begrijpen van filterhandlers in Windows Search
aanbevolen procedures voor het maken van filterhandlers in Windows Search
eigenschappen retourneren van een filterhandler