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
- 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 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.
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.
- Ü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 SieValue1
diesen Schlü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 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}
- 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 seinValue3
.
\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
Value1
von undValue3
die 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 seinValue4
. 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
- Das auf GitHub verfügbare IFilterSample-Codebeispiel 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 Anwendungsregistrierung.
Zugehörige Themen
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