Freigeben über


Grundlegendes zu Filterhandlern in der Windows-Suche

Filterhandler, bei denen es sich um Implementierungen der IFilter-Schnittstelle handelt, scannen Dokumente nach Text und Eigenschaften. Filterhandler extrahieren Textabschnitte aus diesen Elementen, filtern eingebettete Formatierungen heraus und bewahren Informationen zur Position des Texts auf. Sie extrahieren auch Blöcke von Werten, bei denen es sich um Dokumenteigenschaften handelt. IFilter ist die Grundlage für die Erstellung von Anwendungen auf höherer Ebene wie Dokumentindizierungen und anwendungsunabhängigen Viewern.

Dieses Thema ist wie folgt organisiert:

Informationen zur IFilter-Schnittstelle

Microsoft Windows Search verwendet Filter, um den Inhalt von Elementen für die Aufnahme in einen Volltextindex zu extrahieren. Sie können Windows Search erweitern, um neue oder proprietäre Dateitypen zu indizieren, indem Sie Filter zum Extrahieren des Inhalts und Eigenschaftenhandler zum Extrahieren der Eigenschaften von Dateien schreiben.

Die IFilter-Schnittstelle ist so konzipiert, dass sie den spezifischen Anforderungen von Volltext-Suchmaschinen entspricht. Volltextsuchmaschinen wie Windows Search rufen die IFilter-Methoden auf, um Text- und Eigenschaftsinformationen zu extrahieren und einem Index hinzuzufügen. Windows Search bricht die Ergebnisse der zurückgegebenen IFilter::GetText-Methode in Wörter auf, normalisiert sie und speichert sie in einem Index. Wenn verfügbar, verwendet die Suchmaschine die Sprachcode-ID (Language Code Identifier, LCID) eines Textabschnitts, um sprachspezifische Wörtertrennung und Normalisierung durchzuführen.

Windows Search verwendet drei Funktionen, die in der folgenden Tabelle beschrieben sind, um auf registrierte Filterhandler zuzugreifen (Implementierungen der IFilter-Schnittstelle ). Diese Funktionen sind besonders hilfreich beim Laden und Binden an den Filterhandler eines eingebetteten Objekts.

Funktion Description
LoadIFilter Ruft einen Zeiger auf den IFilter ab, der für den angegebenen Inhaltstyp am besten geeignet ist.
BindIFilterFromStorage Ruft einen Zeiger auf den IFilter ab, der für den Inhalt in einem IStorage Interface - Objekt am besten geeignet ist.
BindIFilterFromStream Ruft einen Zeiger auf den IFilter ab, der am besten für einen angegebenen Klassenbezeichner (CLSID) geeignet ist, der aus einer Datenstromvariable abgerufen wird.

Die IFilter-Schnittstelle verfügt über fünf Methoden, die in der folgenden Tabelle beschrieben sind.

Methode Description
IFilter::Init Initialisiert eine Filtersitzung.
IFilter::GetChunk Positioniert IFilter am Anfang des ersten oder nächsten Abschnitts und gibt einen Deskriptor zurück.
IFilter::GetText Ruft Text aus dem aktuellen Abschnitt ab.
IFilter::GetValue Ruft Werte aus dem aktuellen Block ab.
IFilter::BindRegion Ruft eine Schnittstelle ab, die den angegebenen Teil des Objekts darstellt. Reserviert für zukünftige Verwendung.

Isolationsprozess

Windows Search führt IFilter im Sicherheitskontext des lokalen Systems mit eingeschränkten Rechten aus. In diesem IFilter-Host-Isolationsprozess werden mehrere Rechte entfernt:

  • Eingeschränkter Code
  • Jeder
  • Lokal
  • Interaktiv
  • Authentifizierte Benutzer
  • Integrierte Benutzer
  • Benutzersicherheits-ID (SID)

Das Entfernen dieser Rechte bedeutet, dass die IFilter-Schnittstelle keinen Zugriff auf das Datenträgersystem oder Netzwerk oder auf Funktionen der Benutzeroberfläche oder Zwischenablage hat. Darüber hinaus wird der Isolationsprozess unter einem Auftragsobjekt ausgeführt, das verhindert, dass untergeordnete Prozesse erstellt werden, und dem Arbeitssatz wird ein Grenzwert von 100 MB auferlegt. Der Host-Isolationsprozess der IFilter-Schnittstelle erhöht die Stabilität der Indexierungsplattform wegen möglicher falsch implementierter Drittanbieterfilter.

Hinweis

Filterhandler müssen geschrieben werden, um Puffer zu verwalten und ordnungsgemäß zu stapeln. Alle Zeichenfolgenkopien müssen explizite Überprüfungen aufweisen, um Pufferüberläufe zu schützen. Sie sollten immer die zugeordnete Größe des Puffers überprüfen. Sie sollten immer die Größe der Daten anhand der Größe des Puffers testen.

IFilter dlls

IFilter DLLs implementieren die IFilter-Schnittstelle , um einem Client das Extrahieren von Text- und Eigenschaftswertinformationen aus einem Dateityp, einer Klasse oder einem wahrgenommenen Typ zu ermöglichen. Der Windows Search-Filterprozess SearchFilterHost.exe bindet an den IFilter , der für die Klasse, den wahrgenommenen Typ oder die Namenserweiterung des Elements registriert ist.

IFilter-Struktur

Jeder IFilter ist eine DLL-Datei, die einen IN-Process Component Object Model (COM)-Server implementiert, um die angegebenen Filterfunktionen anzugeben. Die folgende Abbildung zeigt die Gesamtstruktur einer typischen IFilter-DLL. Ein komplexeres Beispiel könnte mehrere IFilter-Klassen implementieren.

Diagramm der Struktur einer typischen ifilter dll

Nativer Code

Filter müssen in nativem Code geschrieben werden, da potenzielle Versionsprobleme mit der Common Language Runtime (CLR) bei Prozessen auftreten können, in denen mehrere Add-Ins ausgeführt werden. In Windows 7 und höher und höher werden Filter, die in verwaltetem Code geschrieben wurden, explizit blockiert.

Suchen des IFilter-Klassenbezeichners

Die Klasse der IFilter-DLL wird unter dem Registrierungsschlüssel "PersistentHandler" registriert. Im folgenden Beispiel für HTML-Dateien wird veranschaulicht, wie Die IFilter-DLL für ein HTML-Dokument gefunden wird. Dieses Beispiel folgt einer ähnlichen Logik wie die, die das System verwendet, um den IFilter zu finden, der einem Element zugeordnet ist.

  1. Überprüfen Sie, ob die Erweiterung für den Dateityp, für den die DLL-Filter einen PersistentHandler registriert haben, unter dem Registrierungseintrag \HKEY_LOCAL_MACHINE\SOFTWARE\Classesregistriert ist. Lassen Sie diesen Schlüssel sein Value1. Wenn dieser Eintrag bereits vorhanden ist, fahren Sie mit Schritt 4 dieses Verfahrens fort und verwenden Sie Value1 an entsprechender Stelle. Die Werte sind vom Typ REG_SZ.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Wenn für die Erweiterung kein persistenter Handler registriert ist, suchen Sie alternativ die CLSID, die dem Dokumenttyp unter dem Registrierungseintrag \HKEY_LOCAL_MACHINE\SOFTWARE\Classeszugeordnet ist. Lassen Sie diesen Schlüssel sein Value2.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                CLSID
                   {25336920-03F9-11CF-8FD0-00AA00686F13}
  1. Ermitteln Sie, ob ein PersistentHandler für die CLSID registriert ist. Verwenden Sie das in Schritt 2 bestimmte Value2, um den PersistentHandler für den Eintrag \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2 zu finden. Lassen Sie diesen Schlüssel sein Value3.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Bestimmen Sie die IFilter-GUID des persistenten Handlers. Verwenden Sie Value1 und Value3, um die GUID des IFilter Persistent Handlers für den Dokumenttyp zu finden. Der Wert unter dem Registrierungseintrag \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 oder 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> gibt den PersistentHandler GUID des IFilter für diesen Dokumenttyp zurück. Lassen Sie diesen Schlüssel sein Value4. In diesem Beispiel ist die IFilter-Schnittstellen-GUID 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}

Hinweis

In diesem Beispiel ist die IFilter-DLL für HTML-Dokumente nlhtml.dll.

IFilter::GetChunk und Gebietsschemacode-Identifikatoren

Die LCID des Texts kann innerhalb einer einzelnen Datei geändert werden. Beispielsweise kann der Text eines Handbuchs zwischen Englisch (en-us) und Spanisch (es) wechseln, oder der Text kann ein einzelnes Wort in einer anderen Sprache als der Hauptsprache enthalten. In beiden Fällen muss Ihr IFilter jedes Mal, wenn sich die LCID ändert, einen neuen Block beginnen. Da die LCID zum Auswählen eines geeigneten Worttrennzeichens verwendet wird, ist es sehr wichtig, dass Sie sie richtig identifizieren. Wenn der IFilter das Gebietsschema des Texts nicht bestimmen kann, sollte er eine LCID von Null mit dem Block zurückgeben. Durch das Zurückgeben einer LCID von Null kommt die Spracherkennungstechnologie (Language Auto-Detection, LAD) von Windows Search zum Einsatz, um die Gebietsschema-ID des Abschnitts zu ermitteln. Wenn Windows Search keine Übereinstimmung finden kann, wird standardmäßig die System-Standardsprache verwendet (durch Aufrufen der GetSystemDefaultLocaleName Funktion). Weitere Informationen finden Sie unter IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATE und STAT_CHUNK.

Wenn Sie das Dateiformat kontrollieren und es derzeit keine Gebietsschemainformationen enthält, sollten Sie eine Benutzerfunktion hinzufügen, um die richtige Gebietsschemaidentifikation zu ermöglichen. Die Verwendung eines nicht zusammenpassenden Worttrenners kann zu einer schlechten Abfrageerfahrung für den Benutzer führen. Weitere Informationen finden Sie unter IWordBreaker.

Hinweis

Filter sind Dateitypen zugeordnet, wie durch Dateinamenerweiterungen, MIME-Typen oder CLSIDs angegeben. Während ein Filter mehrere Dateitypen verarbeiten kann, funktioniert jeder Typ nur mit einem Filter.

Weitere Ressourcen

Entwickeln von Filterhandlern

Bewährte Methoden zum Erstellen von Filterhandlern in der Windows-Suche

Zurückgeben von Eigenschaften aus einem Filterhandler

Filterhandler, die mit Windows ausgeliefert werden

Implementieren von Filterhandlern in der Windows-Suche

Registrieren von Filterhandlern

Testen von Filterhandlern