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
- Suchen des IFilter-Klassenbezeichners
- Weitere Ressourcen
- Zugehörige Themen
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.

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.
- Ü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
Value1sein. Wenn dieser Eintrag bereits vorhanden ist, fahren Sie mit Schritt 4 dieses Verfahrens fort, und verwenden Sie in diesemValue1Schlüssel. Die Werte sind vom Typ REG _ SZ.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- 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
Value2sein.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
CLSID
{25336920-03F9-11CF-8FD0-00AA00686F13}
- Bestimmen Sie, ob ein PersistentHandler für die CLSID registriert ist. Suchen Sie mithilfe von
Value2in Schritt 2 ermittelt den PersistentHandler für den \ Eintrag HKEY LOCAL MACHINE SOFTWARE _ Classes _ \ \ \ CLSID \ Value2. Lassen Sie diesen SchlüsselValue3sein.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- Bestimmen Sie die GUID des persistenten IFilter-Handlers. Suchen Sie mithilfe von
Value1und nach derValue3GUID 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üsselValue4sein. 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
- Das IFilterSample-Codebeispiel, das auf GitHubverfügbar ist, veranschaulicht das Erstellen einer IFilter-Basisklasse zum Implementieren der IFilter-Schnittstelle.
- Eine Übersicht über den Indizierungsprozess finden Sie unter Der Indizierungsprozess.
- Eine Übersicht über Dateitypen finden Sie unter Dateitypen.
- Informationen zum Abfragen von Dateizuordnungsattributen für einen Dateityp finden Sie unter PerceivedTypes, SystemFileAssociations und Application Registration.
Zugehörige Themen
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