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.
Filterhandlers, die implementaties zijn van de IFilter interface, scannen documenten op tekst en eigenschappen. Filterhandlers extraheren stukken tekst uit deze items, filteren ingesloten opmaak en behouden informatie over de positie van de tekst. Ze extraheren ook segmenten van waarden, die documenteigenschappen zijn. IFilter is de basis voor het bouwen van toepassingen op een hoger niveau, zoals documentindexeerfuncties en toepassingsonafhankelijke kijkers.
Dit onderwerp is als volgt ingedeeld:
Over de IFilter-interface
Microsoft Windows Search gebruikt filters om de inhoud van items te extraheren voor opname in een index in volledige tekst. U kunt Windows Search uitbreiden om nieuwe of eigen bestandstypen te indexeren door filters te schrijven om de inhoud te extraheren en eigenschappenhandlers om de eigenschappen van bestanden te extraheren.
De IFilter interface is ontworpen om te voldoen aan de specifieke behoeften van zoekprogramma's voor volledige tekst. Zoekprogramma's voor volledige tekst, zoals Windows Search, roepen de IFilter- methoden aan om tekst- en eigenschapsgegevens te extraheren en toe te voegen aan een index. Windows Search breekt de resultaten van de geretourneerde IFilter::GetText methode in woorden, normaliseert ze en slaat ze op in een index. Indien beschikbaar, gebruikt de zoekmachine de taalcode-id (LCID) van een tekstsegment om taalspecifieke woordbreking en normalisatie uit te voeren.
Windows Search maakt gebruik van drie functies, zoals beschreven in de volgende tabel, voor toegang tot geregistreerde filterhandlers (implementaties van de IFilter interface). Deze functies zijn vooral handig bij het laden en binden aan de filterhandler van een ingesloten object.
| Functie | Beschrijving |
|---|---|
| LoadIFilter | Verkrijgt een aanwijzer naar de IFilter die het meest geschikt is voor het opgegeven inhoudstype. |
| BindIFilterFromStorage | Hiermee wordt een aanwijzer opgehaald naar de IFilter die het meest geschikt is voor de inhoud van een IStorage Interface-object. |
| BindIFilterFromStream | Hiermee wordt een aanwijzer opgehaald naar de IFilter- die het meest geschikt is voor een opgegeven klasse-id (CLSID) die is opgehaald uit een stroomvariabele. |
De IFilter interface heeft vijf methoden, zoals beschreven in de volgende tabel.
| Methode | Beschrijving |
|---|---|
| IFilter::Init- | Initialiseert een filtersessie. |
| IFilter::GetChunk | Plaatst IFilter aan het begin van het eerste of volgende stuk en retourneert een descriptor. |
| IFilter::GetText | Hiermee haalt u tekst op uit het huidige segment. |
| IFilter::GetValue- | Haalt waarden op uit het huidige segment. |
| IFilter::BindRegion- | Hiermee wordt een interface opgehaald die het opgegeven gedeelte van het object vertegenwoordigt. Gereserveerd voor toekomstig gebruik. |
Isolatieproces
Windows Search voert IFilters uit in de beveiligingscontext van het lokale systeem met beperkte rechten. In dit IFilter hostisolatieproces worden een aantal rechten verwijderd:
- Beperkte code
- Iedereen
- Lokaal
- Interactief
- Geverifieerde gebruikers
- Ingebouwde gebruikers
- Beveiligings-id van gebruikers (SID)
Het verwijderen van deze rechten betekent dat de IFilter-interface interface geen toegang heeft tot het schijfsysteem of netwerk of tot een gebruikersinterface of klembordfunctie. Bovendien wordt het isolatieproces uitgevoerd onder een taakobject dat voorkomt dat onderliggende processen worden gemaakt en dat een limiet van 100 MB oplegt aan de werkset. de IFilter interfacehost-isolatieproces verhoogt de stabiliteit van het indexeringsplatform, vanwege de mogelijkheid van verkeerd geïmplementeerde filters van derden.
Notitie
Filterhandlers moeten worden geschreven om buffers te beheren en correct te stapelen. Alle tekenreekskopieën moeten uitgebreide controles hebben om bufferoverschrijdingen te voorkomen. Controleer altijd de toegewezen grootte van de buffer. U moet altijd de grootte van de gegevens testen op basis van de grootte van de buffer.
IFilter-dll's
IFilter DLL's implementeren de interface IFilter om een client in staat te stellen tekst- en eigenschapswaardegegevens op te halen uit een bestandstype, klasse of waargenomen type. Het filterproces van Windows Search SearchFilterHost.exe bindt aan de IFilter- die is geregistreerd voor de klasse, het waargenomen type of de naamextensie van het item.
IFilter-structuur
Elke IFilter- is een DLL-bestand dat een in-proces Component Object Model (COM)-server implementeert om de opgegeven filtermogelijkheden te leveren. In de volgende afbeelding ziet u de algehele structuur van een typische IFilter DLLs. Een complexer voorbeeld kan meer dan één IFilter klasse implementeren.
Systeemeigen code
Filters moeten worden geschreven in systeemeigen code vanwege mogelijke problemen met clr-versiebeheer (Common Language Runtime) met het proces waarin meerdere invoegtoepassingen worden uitgevoerd. In Windows 7 en hoger worden filters die zijn geschreven in beheerde code expliciet geblokkeerd.
De IFilter-klasse-id zoeken
De klasse van de IFilter DLL is geregistreerd onder de registersleutel PersistentHandler. In het volgende voorbeeld ziet u voor HTML-bestanden hoe u de IFilter DLL voor een HTML-document kunt vinden. In dit voorbeeld volgt de logica die vergelijkbaar is met de logica die door het systeem wordt gebruikt om de IFilter te vinden die aan een item zijn gekoppeld.
- Controleer of de extensie voor het type bestanden die de DLL-filters gebruiken een PersistentHandler geregistreerd heeft bij de registerinvoer \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Laat deze sleutel zijn
Value1. Als deze vermelding al bestaat, sla dan stap 4 van deze procedure over en gebruikValue1in die sleutel. De waarden zijn van het type REG_SZ.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- Als er geen PersistentHandler is geregistreerd voor de extensie, zoekt u de CLSID die is gekoppeld aan het documenttype onder de registervermelding \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Laat deze sleutel zijn
Value2.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
CLSID
{25336920-03F9-11CF-8FD0-00AA00686F13}
- Bepaal of een PersistentHandler is geregistreerd voor de CLSID. Gebruik
Value2, zoals bepaald in stap 2, om de PersistentHandler voor de vermeldingHKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2 te vinden. Laat deze sleutel zijnValue3.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- Bepaal de IFilter GUID van de permanente handler. Zoek met
Value1enValue3de IFilter Persistent Handler-GUID voor het documenttype. De waarde onder de registervermelding \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 of 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> levert de IFilter PersistentHandler GUID voor dit documenttype. Laat deze sleutel zijnValue4. In dit voorbeeld is de GUID IFilter interface 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}
Notitie
In dit voorbeeld is het IFilter DLL voor HTML-documenten nlhtml.dll.
IFilter::GetChunk en landinstellingscode-id's
De LCID van tekst kan binnen één bestand worden gewijzigd. De tekst van een instructiehandleiding kan bijvoorbeeld wisselen tussen Engels (en-us) en Spaans (es) of de tekst kan één woord bevatten in een andere taal dan de primaire taal. In beide gevallen moet uw IFilter een nieuw blok starten telkens wanneer de LCID verandert. Omdat de LCID wordt gebruikt om een geschikte woordonderbreker te kiezen, is het erg belangrijk dat u deze juist identificeert. Als de IFilter de landinstelling van de tekst niet kan bepalen, moet er een LCID van nul met het segment worden geretourneerd. Als een LCID van nul wordt geretourneerd, gebruikt Windows Search de LAD-technologie (Language Auto-Detection) om de locatie-ID van het gegevensblok te bepalen. Als Windows Search geen overeenkomst kan vinden, wordt standaard de standaardinstelling van het systeem gebruikt (door de GetSystemDefaultLocaleName-functie aan te roepen functie). Zie IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATEen STAT_CHUNKvoor meer informatie.
Als u de bestandsindeling bepaalt en deze momenteel geen landinstellingengegevens bevat, moet u een gebruikersfunctie toevoegen om de juiste landinstellingsidentificatie in te schakelen. Het gebruik van een niet-overeenkomende woordonderbreker kan leiden tot een slechte query-ervaring voor de gebruiker. Zie IWordBreaker-voor meer informatie.
Notitie
Filters zijn gekoppeld aan bestandstypen, zoals aangegeven door bestandsnaamextensies, MIME-typen of CLSID's. Hoewel één filter meerdere bestandstypen kan verwerken, werkt elk type met slechts één filter.
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 ontwikkelen van filterhandlers
aanbevolen procedures voor het maken van filterhandlers in Windows Search
Eigenschappen van een filterhandler retourneren
Filterhandlers die met Windows worden meegeleverd