Grundlegendes zu Filterhandlern in Windows Search

Filterhandler, bei denen es sich um Implementierungen der IFilter-Schnittstelle handelt, überprüfen Dokumente auf Text und Eigenschaften. Filterhandler extrahieren Textblöcke aus diesen Elementen, filtern eingebettete Formatierungen heraus und behalten Informationen über die Position des Texts bei. 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, z. B. Dokumentindexer und anwendungsunabhängige Viewer.

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 indizierung, indem Sie Filter schreiben, um den Inhalt zu extrahieren, und Eigenschaftenhandler, um die Eigenschaften von Dateien zu extrahieren.

Die IFilter-Schnittstelle wurde entwickelt, um die spezifischen Anforderungen von Volltextsuch-Engines zu erfüllen. Volltextsuchmodule wie Windows Search rufen die IFilter-Methoden auf, um Text- und Eigenschaftsinformationen zu extrahieren und sie einem Index hinzuzufügen. Windows Search unterbricht die Ergebnisse der zurückgegebenen IFilter::GetText-Methode in Wörter, normalisiert sie und speichert sie in einem Index. Falls verfügbar, verwendet die Suchmaschine den Sprachcodebezeichner (LCID) eines Textabschnitts, um sprachspezifische Wörter zu brechen und zu normalisieren.

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

Funktion BESCHREIBUNG
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 am besten für den Inhalt in einem IStorage Interface-Objekt geeignet ist.
BindIFilterFromStream Ruft einen Zeiger auf den IFilter ab, der am besten für einen angegebenen Klassenbezeichner (CLSID) geeignet ist, der aus einer Streamvariablen abgerufen wird.

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

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

Isolationsprozess

Windows Search führt IFilters im Sicherheitskontext des lokalen Systems mit eingeschränkten Rechten aus. In diesem IFilter-Hostisolationsprozess werden eine Reihe von Rechten entfernt:

  • Eingeschränkter Code
  • Jeder
  • Lokal
  • Interactive
  • Authentifizierte Benutzer
  • Integrierte Benutzer
  • Sicherheits-ID (SID) des Benutzers

Das Entfernen dieser Rechte bedeutet, dass die IFilter-Schnittstelle keinen Zugriff auf das Datenträgersystem oder Netzwerk oder auf eine Benutzeroberfläche oder Zwischenablagefunktionen hat. Darüber hinaus wird der Isolationsprozess unter einem Auftragsobjekt ausgeführt, das verhindert, dass untergeordnete Prozesse erstellt werden, und die Arbeitsmenge wird auf 100 MB beschränkt. Der IFilter-Schnittstellenhostisolationsprozess erhöht die Stabilität der Indizierungsplattform aufgrund der Möglichkeit falsch implementierter Filter von Drittanbietern.

Hinweis

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

IFilter-DLLs

Ifilter DLLs implementieren die IFilter-Schnittstelle, damit ein Client Text- und Eigenschaftswertinformationen aus einem Dateityp, einer Klasse oder einem wahrgenommenen Typ extrahieren kann. Der Windows Suchfilterungsprozess SearchFilterHost.exe wird an den IFilter gebunden, 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 COM-Server (In-Process Component Object Model) implementiert, um die angegebenen Filterfunktionen anzugeben. Die folgende Abbildung veranschaulicht die Gesamtstruktur einer typischen IFilter-DLLs. Ein komplexeres Beispiel könnte mehrere IFilter-Klassen implementieren.

Diagramm der Struktur einer typischen ifilter-DLL

nativer Code

Filter müssen aufgrund potenzieller CLR-Versionsprobleme (Common Language Runtime) mit dem Prozess, in dem mehrere Add-Ins ausgeführt werden, in nativem Code geschrieben werden. In Windows 7 und höher werden in verwaltetem Code geschriebene Filter explizit blockiert.

Suchen des IFilter-Klassenbezeichners

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

  1. Überprüfen Sie, ob die Erweiterung für den Typ der Dateien, die von den DLL-Filtern gefiltert werden, über einen PersistentHandler verfügt, der unter dem Registrierungseintrag HKEY LOCAL MACHINE SOFTWARE Classes registriert \ _ _ \ \ ist. Lassen Sie diesen Schlüssel Value1 sein. Wenn dieser Eintrag bereits vorhanden ist, fahren Sie mit Schritt 4 dieses Verfahrens fort, und verwenden Sie in diesem Value1 Schlüssel. Die Werte sind vom Typ REG _ SZ.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Wenn kein PersistentHandler für die Erweiterung registriert ist, suchen Sie alternativ die CLSID, die dem Dokumenttyp zugeordnet ist, unter dem Registrierungseintrag \ HKEY _ LOCAL MACHINE _ SOFTWARE \ \ Classes. Lassen Sie diesen Schlüssel Value2 sein.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                CLSID
                   {25336920-03F9-11CF-8FD0-00AA00686F13}
  1. Bestimmen Sie, ob ein PersistentHandler für die CLSID registriert ist. Suchen Sie mithilfe von Value2 in Schritt 2 ermittelt den PersistentHandler für den \ Eintrag HKEY LOCAL MACHINE SOFTWARE _ Classes _ \ \ \ CLSID \ Value2. Lassen Sie diesen Schlüssel Value3 sein.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Bestimmen Sie die GUID des persistenten IFilter-Handlers. Suchen Sie mithilfe von Value1 und nach der Value3 GUID des persistenten IFilter-Handlers für den Dokumenttyp. Der Wert unter dem Registrierungseintrag \ HKEY _ LOCAL MACHINE SOFTWARE Classes _ \ \ \ CLSID \ Value1 oder 3 \ PersistentAddinsRegistered \ 89BCB740-6119-101A-BCB7-00DD010655AF"/> ergibt die IFilter PersistentHandler GUID für diesen Dokumenttyp. Lassen Sie diesen Schlüssel Value4 sein. In diesem Beispiel lautet die GUID der IFilter-Schnittstelle 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 wird die IFilter-DLL für HTML-Dokumente nlhtml.dll.

IFilter::GetChunk und Gebietsschemacodebezeichner

Die LCID des Texts kann sich innerhalb einer einzelnen Datei ändern. Beispielsweise kann der Text eines Anweisungshandbuchs zwischen Englisch (en-us) und Spanisch (es) wechseln, oder der Text kann ein einzelnes Wort in einer anderen Sprache als der primären Sprache enthalten. In beiden Fällen muss Ihr IFilter jedes Mal, wenn sich die LCID ändert, einen neuen Block starten. Da die LCID verwendet wird, um eine geeignete Wörterpause auszuwählen, ist es sehr wichtig, dass Sie sie richtig identifizieren. Wenn der IFilter das Gebietsschema des Texts nicht bestimmen kann, sollte er eine LCID von 0 (null) mit dem Block zurückgeben. Die Rückgabe einer LCID von 0 führt dazu, dass Windows Search die LAD-Technologie (Language Auto-Detection) verwendet, um die Gebietsschema-ID des Blockes zu bestimmen. Wenn Windows Suche keine Übereinstimmung finden kann, wird standardmäßig das Standardschema des Systems verwendet (durch Aufrufen der Funktion GetSystemDefaultLocaleName). Weitere Informationen finden Sie unter IFilter::GetChunk, CHUNK _ BREAKTYPE, CHUNKSTATEund STAT _ CHUNK.

Wenn Sie das Dateiformat steuern und es derzeit keine Gebietsschemainformationen enthält, sollten Sie ein Benutzerfeature hinzufügen, um eine ordnungsgemäße Gebietsschemaidentifizierung zu ermöglichen. Die Verwendung einer nicht übereinstimmenden Wörterpause kann zu einer schlechten Abfrageerfahrung für den Benutzer führen. Weitere Informationen finden Sie unter IWordBreaker.

Hinweis

Filter werden Dateitypen zugeordnet, wie durch Dateinamenerweiterungen, MIME-Typen oder CLSIDs gekennzeichnet. 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 Windows Search

Zurückgeben von Eigenschaften von einem Filterhandler

Filterhandler, die mit Windows

Implementieren von Filterhandlern in Windows Search

Registrieren von Filterhandlern

Testen von Filterhandlern