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 zur Position des Texts bei. Sie extrahieren auch Werteblöcke, 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 indizieren, indem Sie Filter zum Extrahieren des Inhalts und Eigenschaftenhandler schreiben, um die Eigenschaften von Dateien zu extrahieren.

Die IFilter-Schnittstelle wurde entwickelt, um die spezifischen Anforderungen von Volltextsuchmaschinen zu erfüllen. Volltextsuchmaschinen wie Windows Search rufen die IFilter-Methoden auf, um Text- und Eigenschafteninformationen 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 (Language Code Identifier, LCID) eines Textblocks, um sprachspezifische Wortbrüche und -normalisierungen durchzuführen.

Windows Search verwendet drei Funktionen, die in der folgenden Tabelle beschrieben werden, 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 von 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 Blöckes 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
  • Benutzersicherheits-ID (SID)

Das Entfernen dieser Rechte bedeutet, dass die IFilter-Schnittstelle keinen Zugriff auf das Datenträgersystem oder Netzwerk oder auf Benutzerschnittstellen- oder Zwischenablagefunktionen hat. Darüber hinaus wird der Isolationsprozess unter einem Auftragsobjekt ausgeführt, das verhindert, dass untergeordnete Prozesse erstellt werden und dem Arbeitssatz ein Limit von 100 MB auferlegt wird. der Hostisolationsprozess der IFilter-Schnittstelle erhöht die Stabilität der Indizierungsplattform aufgrund der Möglichkeit 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 verhindern. 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 Search-Filterprozess SearchFilterHost.exe 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 prozessinternen COM-Server (Component Object Model) implementiert, um die angegebenen Filterfunktionen bereitzustellen. Die folgende Abbildung veranschaulicht die Gesamtstruktur einer typischen IFilter-DLLs . Ein komplexeres Beispiel könnte mehr als eine IFilter-Klasse implementieren.

Diagramm der Struktur einer typischen ifilter-DLL

nativer Code

Filter müssen aufgrund potenzieller ClR-Versionsverwaltungsprobleme (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 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 PersistentHandler-Registrierungsschlüssel registriert. Im folgenden Beispiel für HTML-Dateien wird veranschaulicht, wie Sie die IFilter-DLL für ein HTML-Dokument finden. Dieses Beispiel folgt einer Logik, die der vom System zum Suchen des einem Element zugeordneten IFilter verwendet wird.

  1. Überprüfen Sie, ob die Erweiterung für den Dateityp, den die DLL filtert, über einen PersistentHandler verfügt, der unter dem Registrierungseintrag \HKEY_LOCAL_MACHINE\SOFTWARE\Classes registriert ist. Lassen Sie diesen Schlüssel sein Value1. Wenn dieser Eintrag bereits vorhanden ist, fahren Sie mit Schritt 4 dieser Prozedur fort, und verwenden Sie Value1 diesen 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 dem Dokumenttyp zugeordnete CLSID unter dem Registrierungseintrag \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. 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. Suchen Sie Value2 mithilfe der in Schritt 2 ermittelten Datei persistentHandler für den Eintrag \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2. 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 GUID des persistenten IFilter-Handlers . Suchen Sie mithilfe Value1 von und Value3die IFilter Persistent Handler GUID für den Dokumenttyp. Der Wert unter dem Registrierungseintrag \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 oder 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> gibt die IFilter PersistentHandler-GUID für diesen Dokumenttyp zurück. Lassen Sie diesen Schlüssel sein Value4. In diesem Beispiel ist 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 Handbuchs zwischen Englisch (en-us) und Spanisch (es) wechseln, oder der Text kann ein einzelnes Wort in einer anderen Sprache als der Primärsprache enthalten. In beiden Fällen muss Ihr IFilter jedes Mal, wenn sich die LCID ändert, einen neuen Block beginnen. Da die LCID verwendet wird, um eine geeignete Worttrennung auszuwählen, ist es sehr wichtig, dass Sie ihn richtig identifizieren. Wenn der IFilter das Gebietsschema des Texts nicht bestimmen kann, sollte er eine LCID von 0 mit dem Block zurückgeben. Das Zurückgeben einer LCID von null führt dazu, dass Windows Search die Spracherkennungstechnologie (Language Auto-Detection, LAD) verwendet, um die Gebietsschema-ID des Blöckes zu bestimmen. Wenn Windows Search keine Übereinstimmung finden kann, wird standardmäßig das Standardgebietsschema des Systems verwendet (durch Aufrufen der Funktion GetSystemDefaultLocaleName Function ). Weitere Informationen finden Sie unter IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATE und STAT_CHUNK.

Wenn Sie das Dateiformat steuern und derzeit keine Gebietsschemainformationen enthält, sollten Sie ein Benutzerfeature hinzufügen, um die ordnungsgemäße Gebietsschemaidentifikation zu aktivieren. Die Verwendung einer nicht übereinstimmenden Worttrennung kann zu einer schlechten Abfrageerfahrung für den Benutzer führen. Weitere Informationen finden Sie unter IWordBreaker.

Hinweis

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

Zusätzliche 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 ausgeliefert werden

Implementieren von Filterhandlern in Windows Search

Registrieren von Filterhandlern

Testen von Filterhandlern