Inzicht in filterhandlers in Windows Search

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.

diagram van de structuur van een typische ifilter-dll-

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.

  1. 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 gebruik Value1 in die sleutel. De waarden zijn van het type REG_SZ.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. 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}
  1. 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 zijn Value3.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Bepaal de IFilter GUID van de permanente handler. Zoek met Value1 en Value3de 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 zijn Value4. 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 ontwikkelen van filterhandlers

aanbevolen procedures voor het maken van filterhandlers in Windows Search

Eigenschappen van een filterhandler retourneren

Filterhandlers die met Windows worden meegeleverd

Filterhandlers implementeren in Windows Search

Filterhandlers registreren

Filterhandlers testen