Share via


Entwickeln von IFilter-Add-Ins

Hinweis

Windows Desktop Search 2.x ist eine veraltete Technologie, die ursprünglich als Add-In für Windows XP und Windows Server 2003 verfügbar war. Verwenden Sie in späteren Versionen stattdessen Windows Search .

Sie können Microsoft Windows Desktop Search (WDS) um Filter-Add-Ins erweitern, komponenten, die die IFilter-Schnittstelleimplementieren, um neue Dateitypen einzuschließen. Filter sind für den Zugriff auf und die Analyse von Daten in Dateien sowie für die Rückgabe von Eigenschaften- und Wertepaaren sowie Textblöcken für die Indizierung verantwortlich. Während des Indizierungsprozesses ruft WDS den entsprechenden Filter mit der URL für jede Datei oder jedes Element auf. Der Filter extrahiert zuerst Metadaten, die Eigenschaften entsprechen, die im WDS-Schema als abrufbar gekennzeichnet sind, z. B. Titel, Dateigröße und Datum der letzten Änderung. Anschließend wird der Elementinhalt in Textblöcke unterteilt. WDS fügt dem Katalog die eigenschaften und den vom Filter zurückgegebenen Text hinzu. WDS kann jeden Dateityp indizieren, für den ein Filter registriert ist.

Unter bestimmten Umständen müssen Sie keinen neuen Filter schreiben. WDS 2.x enthält Filter für mehr als 200 Elementtypen (einschließlich Klartextelementen wie HTML-, XML- und Quellcodedateien) und verwendet die gleiche IFilter-Technologiewie SharePoint Services. Wenn Sie bereits Filter für Ihre Dateitypen installiert haben, kann WDS diese vorhandenen Filter verwenden, um diese Daten zu indizieren. Darüber hinaus enthält WDS einen allgemeinen Filter für Nur-Text-basierte Dateitypen. Wenn Sie über einen Dateityp verfügen, der entweder von einem vorhandenen SharePoint Services-Filter oder dem Klartextfilter verarbeitet werden kann, können Sie der Registrierung die Dateinamenerweiterung und die Filter-GUID hinzufügen, damit WDS sie finden und verwenden kann (weitere Informationen finden Sie unter So registrieren Sie ein Filter-Add-In).

Wenn Sie jedoch über ein Nicht-Klartext- und proprietäres Daten- oder Dateiformat verfügen, ist das Schreiben einer benutzerdefinierten Filterimplementierung die einzige Möglichkeit, sicherzustellen, dass WDS das Dateiformat im Katalog indizieren kann. Sie können nur ein Filter-Add-In für einen Dateityp verwenden, sodass es möglich ist, einen vorhandenen Filter zu überschreiben oder einen anderen Filter für einen bestimmten Dateityp außer Kraft zu setzen.

Dieser Abschnitt enthält die folgenden Themen:

Erforderliche Filterschnittstellen

Ein Filter-Add-In muss die IFilter-Schnittstelleund eine der folgenden Schnittstellen implementieren:

  • IPersistStream : Zum Laden von Daten aus einem Stream. Dies ist sicherer als die Verwendung von Dateien, da nichts auf den Datenträger geschrieben wird. Die IPersistStream-Schnittstelle ist die bevorzugte Methode für die Vorwärtskompatibilität mit Windows Vista.
  • IPersistFile-Schnittstelle : Zum Laden von Daten aus einer Datei. Diese Schnittstelle wird in Windows Vista nicht unterstützt.
  • IPersistStorage-Schnittstelle : Zum Laden von Daten aus einem strukturierten OLE COM-Speicher.

Ein Filter-Add-In verwendet diese Schnittstellen, um den Inhalt des Elements abzurufen und iterativ an den Index zurückzugeben, bis das Ende der Datei erreicht ist. Ein Filter-Add-In sollte so robust wie möglich sein, um beschädigte Dateien und solche zu verarbeiten, die nicht den erwarteten Eingabeformaten entsprechen.

IFilter-Schnittstelle

Dies ist eine erforderliche Schnittstelle für eine Filterimplementierung. Weitere Informationen finden Sie in der Referenz zur IFilter-Schnittstelle.

Methode Beschreibung
Init() Initialisiert eine Filtersitzung.
GetChunk() Positioniert den Filter am Anfang des ersten oder nächsten Blocks und gibt einen Deskriptor zurück.
GetText() Ruft Text aus dem aktuellen Block ab.
GetValue() Ruft Eigenschaftswerte aus dem aktuellen Block ab.
BindRegion() Derzeit für den internen Gebrauch reserviert; nicht implementieren. Diese Methode gibt E_NOTIMPL zurück.

 

Ipersiststream

Diese Schnittstelle lädt eine Datei aus einem Stream für eine sicherere Verarbeitung als die IPersistFile-Schnittstelle , da der Kontext, in dem ein IPersistStream-Filter ausgeführt wird, nicht die Rechte zum Öffnen von Dateien auf dem Datenträger oder über das Netzwerk benötigt. Von den beiden Methoden für den Zugriff auf eine einzelne Datei ist dies die bevorzugte Methode für die Vorwärtskompatibilität mit Windows.

Methode Beschreibung
IsDirty() Überprüft, ob eine Änderung vorgenommen wurde. Diese Methode gibt E_NOTIMPL in Filtern zurück.
InitNew() Erstellt einen neuen Speicher. Diese Methode gibt E_NOTIMPL in Filtern zurück.
Load() Initialisiert ein Objekt aus dem Stream, in dem es zuvor gespeichert wurde.
Save() Speichert ein Objekt im angegebenen Stream und gibt an, ob das Objekt sein modifiziert-Flag zurücksetzen soll. Diese Methode gibt E_NOTIMPL in Filtern zurück.
GetSizeMax() Gibt die Größe des Streams in Bytes zurück, der für das Speichern des Objekts benötigt wird. Diese Methode gibt E_NOTIMPL in Filtern zurück.

 

Ipersistfile

Diese Schnittstelle lädt eine Datei nach absolutem Pfad und wird in Windows Vista nicht unterstützt.

Methode Beschreibung
GetCurFile() Ruft den aktuellen Namen der Datei ab, die dem -Objekt zugeordnet ist. Gibt den in Load() angegebenen Pfad zurück.
Load() Öffnet die angegebene Datei, und initialisiert ein Objekt aus dem Dateiinhalt. Sie können das Öffnen der Datei verzögern, bis Sie sie benötigen.
GetClassID() Gibt den Klassenbezeichner (CLSID) für den neuen Dateityp zurück. Sie sollten uuidgen.exe verwenden, um eine eindeutige CLSID zu generieren.
IsDirty() Nur E_NOTIMPL in Filtern zurückgeben
Save() Nur E_NOTIMPL in Filtern zurückgeben
SaveCompleted() Nur E_NOTIMPL in Filtern zurückgeben

 

IPersistStorage

Diese Schnittstelle unterstützt das strukturierte Speichermodell, bei dem jedes enthaltene Objekt über einen eigenen Speicher verfügt, der im Speicher des Containers geschachtelt ist. Wie die IPersistFile-Schnittstelle wird diese Schnittstelle nach absolutem Pfad geladen und wird in Windows Vista nicht unterstützt.

Methode Beschreibung
IsDirty() Überprüft, ob eine Änderung erfolgt ist. Diese Methode gibt E_NOTIMPL in Filtern zurück.
InitNew() Erstellt einen neuen Speicher. Diese Methode gibt E_NOTIMPL in Filtern zurück.
Load() Speichert den Speicher. Diese Methode gibt E_NOTIMPL in Filtern zurück.
Save() Gibt die Größe des Streams in Bytes zurück, der für das Speichern des Objekts benötigt wird. Diese Methode gibt E_NOTIMPL in Filtern zurück.
SaveCompleted() Für die interne Verwendung reserviert. Diese Methode gibt E_NOTIMPL in Filtern zurück.
HandsOffStorage() Für die interne Verwendung reserviert. Diese Methode gibt E_NOTIMPL in Filtern zurück.

 

Ausgeben von Eigenschaften mit Filtern

Der Zweck eines Filters besteht darin, den Inhalt und die Eigenschaften von Dateien für die Aufnahme in den Volltextindex zu extrahieren. WDS ruft zuerst die Load-Methode für die Implementierungen IPersistFile, IPersistStream oder IPersistStorage auf und ruft dann die Init-Methode der IFilter-Implementierung auf. GetChunk wird aufgerufen, um Textblöcke oder Eigenschaftenwertdaten abzurufen, und dann wird entweder GetText oder GetValue so oft aufgerufen, wie es erforderlich ist, um alle dem Block zugeordneten Text- oder Eigenschaftswerte abzurufen. Dieser Vorgang wird wiederholt, bis GetChunk meldet, dass es keine weiteren Blöcke im Dokument gibt.

Die GetChunk-Methode ruft Informationen über den ersten oder nächsten logischen Informationsblock aus der gefilterten Datei ab und gibt diese Informationen in einer STAT_CHUNK-Struktur zurück, einschließlich einer monoton zunehmenden Block-ID, status Informationen darüber, wie sich der aktuelle Block auf den vorherigen Blöcke bezieht, ein Flag, das angibt, ob der Block Text oder einen Wert enthält, das Gebietsschema des Blöckes und die Eigenschaftsspezifikation des Blöckes. Die Eigenschaftsspezifikation ist eine FULLPROPSPEC , die aus einer CLSID und entweder einem Ganzzahl- oder Zeichenfolgeneigenschaftenbezeichner besteht (z. B. D5CDD505-2E9C-101B-9397-08002B2CF9AE/PerceivedType). Er identifiziert den Typ der Eigenschaft und nicht den Eigenschaftswert selbst.

Der Chunk-Gebietsschemabezeichner wird verwendet, um eine geeignete Worttrennung auszuwählen, und es ist sehr wichtig, dass Sie ihn richtig identifizieren. Wenn der Filter das Gebietsschema des Texts nicht bestimmen kann, sollte das Standardsystemgebietsschema angenommen werden, das mithilfe von GetSystemDefaultLCID verfügbar ist. 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 Abfrageumgebung für den Benutzer führen.

GetChunk verwaltet nur den Zugriff auf Blöcke und gibt den Text- oder Eigenschaftswert selbst nicht zurück. Stattdessen rufen nachfolgende Aufrufe von GetText und GetValue den Textkörper des Blöckes ab. GetText gibt Textblöcke zurück, bei denen es sich um Unicode-Zeichenfolgen handelt, aus dem aktuellen CHUNK_TEXT Block. Wenn der aktuelle Block zu groß ist, kann mehr als ein Aufruf der GetText-Methode erforderlich sein. Jeder Aufruf der GetText-Methode ruft Text ab, der unmittelbar auf den Text aus dem letzten Aufruf der GetText-Methode folgt. Beispielsweise kann das letzte Zeichen eines Aufrufs in der Mitte eines Worts sein, und das erste Zeichen im nächsten Aufruf würde dieses Wort fortsetzen. Suchmaschinen müssen diese Situation bewältigen.

GetValue gibt Eigenschaftswerte für den aktuellen CHUNK_VALUE-Block in PROPVARIANT-Strukturen zurück, der eine Vielzahl von Datentypen enthalten kann. GetValue muss die PROPVARIANT-Struktur selbst mithilfe von CoTaskMemAlloc zuordnen. Der Aufrufer von GetValue ist für das Freigeben von Speicher verantwortlich, auf den PROPVARIANT mithilfe von PropVariantClear verweist, und für das Freigeben der Struktur selbst mit CoTaskMemFree. Weitere Informationen zu PROPVARIANTs finden Sie in der PROPVARIANT-Referenz .

Eigenschaftswerte

Filter sollten mindestens die folgenden Eigenschaften ausgeben, die die Standardspalten in der WDS-Ergebnisansicht sind.

GUID PROPSPEC Anzeigename Beschreibung
F29F85E0-4FF9-1068-AB91-08002B27B3D9 2 PrimaryTitle Titel, der für dieses Element angezeigt wird.
F29F85E0-4FF9-1068-AB91-08002B27B3D9 4 PrimaryAuthors Person, die diesem Element am häufigsten zugeordnet ist.
D5CDD505-2E9C-101B-9397-08002B2CF9AE PrimaryDate PrimaryDate Wichtigstes Datum für das Element, z. B. Datum, das für E-Mail empfangen oder für Dateien geändert wurde.
D5CDD505-2E9C-101B-9397-08002B2CF9AE PerceivedType PerceivedType Typ der zu analysierenden Datei. Muss mit einem der Windows Desktop Search-Typen übereinstimmen, die in WDS Perceived Type aufgeführt sind.

 

Für Nurtextelemente extrahiert WDS alle Text- und systemdefinierten Eigenschaften wie Dateigröße oder Erweiterung für einschließlich neuer Klartextdateitypen in den Index). Weitere Eigenschaftentypen, die an den Index zurückgegeben werden können, sind:

  • Für Dateien: Autor, Titel, status, Schlüsselwörter
  • Für Medien: Album, Genre, Kamerabild, Datum genommen
  • Für kommunikation: von, bis, cc, wichtigkeit
  • Für Kontakte: Berufsbezeichnung, Geschäftstelefon, Unternehmen

Die obige Liste gruppiert Eigenschaften, die einem angegebenen wahrgenommenen Typ gemeinsam sind. jede Eigenschaft kann jedoch unabhängig vom Typ verwendet werden. Beispielsweise könnte das Unternehmen für den Arbeitgebernamen eines Kontakts verwendet werden und auch verwendet werden, um auf den Namen eines Clients zu verweisen, auf den sich die Datei bezieht. Viele dieser Eigenschaften werden verwendet, um Suchergebnisse in der WDS-Ergebnisansicht anzuzeigen. Beispielsweise wird die Title-Eigenschaft einer Datei als Standard Spalte in der Standardergebnisansicht angezeigt. IFilter-Objekte sollten alle Eigenschaften ausgeben, die sich auf den Elementtyp beziehen, den sie analysieren. Benutzerdefinierte Eigenschaften können in WDS 2.x nicht hinzugefügt werden. Eine vollständige Liste der verfügbaren Eigenschaften finden Sie im WDS-Schema.

Installation von Filter-Add-Ins

Bei der Installation des Filters wird die DLL an einen entsprechenden Speicherort im Verzeichnis Programme kopiert und registriert. Filter sollten die Selbstregistrierung für die Installation implementieren und die folgenden Richtlinien befolgen:

  • Das Installationsprogramm muss entweder DAS EXE- oder MSI-Installationsprogramm verwenden.
  • Versionshinweise müssen bereitgestellt werden.
  • Für jedes installierte Add-In muss ein Eintrag "Software" erstellt werden.
  • Das Installationsprogramm muss alle Registrierungseinstellungen für den bestimmten Dateityp oder Den jeweiligen Speicher übernehmen, den das aktuelle Add-In versteht.
  • Wenn ein vorheriges Add-In überschrieben wird, sollte das Installationsprogramm den Benutzer benachrichtigen.
  • Wenn ein neueres Add-In das vorherige Add-In überschrieben hat, sollte es die Möglichkeit geben, die Funktionalität des vorherigen Add-Ins wiederherzustellen und es erneut zum Standard-Add-In für diesen Dateityp oder speicher zu machen.

FÜR die Registrierung erforderliche CLSIDs

Jedem Filter sind drei Klassenbezeichner oder CLSIDs zugeordnet. Sie müssen mindestens eine dieser Elemente generieren (verwenden Sie uuidgen.exe), um Ihr Filter-Add-In zu registrieren.

  • Die erste identifiziert den persistenten Handler aller Filter, IID_IFilter, der {89BCB740-6119-101A-BCB7-00DD010655AF}ist. Diese CLSID ist konstant für alle Filter, die IFilter implementieren.
  • Der zweite Wert (der Wert des IID_IFilter-Schlüssels) identifiziert die IFilter-Implementierung für Ihren Dateityp. Dieser Schlüssel enthält einen InprocServer32-Wert, der den DLL-Namen nach Pfad und Threadingmodell angibt. Wenn sich der Filter im Systempfad befindet, wie das system32-Verzeichnis, ist ein Dateiname ausreichend. Andernfalls sollte dieser Wert eine vollständige Pfadspezifikation aufweisen.
  • Die dritte identifiziert den Dateityp, den der Filter verarbeitet, und wird von der GetClassID-Methode auf Ihrer IPersist-Schnittstelle zurückgegeben.

Hinweis

In zukünftigen Versionen von Microsoft-Betriebssystemen kann die Installation von Dateien im Verzeichnis system32 schwieriger werden. Daher wird empfohlen, sie unter Programme zu installieren und einen vollständigen Pfad zum Filter in die Registrierung aufzunehmen. Aus Sicherheitsgründen ist es auch ratsam, einen vollständigen Pfad zu Ihrer DLL in der Registrierung anzugeben. Andernfalls könnte eine "Trojaner"-Version Ihrer DLL geladen werden, wenn sie sich im Prozesspfad vor Ihrer Version befindet.

 

Registrierungsmodell

Wenn WDS bereit ist, eine Datei zu filtern, sucht es in der Registrierung unter der Dateierweiterung, um zu bestimmen, welcher Filter geladen werden soll. Anschließend folgt eine Reihe von Registrierungslinks, um den Namen der Filter-DLL in der folgenden Reihenfolge zu finden:

  1. Von CLSIDs unter:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

  2. Aus dem Dateiinhaltstyp unter:

    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Content Type

  3. Aus der Dateinamenerweiterung (identisch mit der Win32 LoadIFilter-API) unter:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

    HKEY_CLASSES_ROOT\extpersistentHandler-CLSID-IID_IFilter-CLSID>>>

  4. Ab Standard unter:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

So registrieren Sie ein Filter-Add-In

Sie müssen insgesamt acht Einträge in der Registrierung vornehmen, um Ihr Filter-Add-In zu registrieren, wobei:

  • .ext ist die neue Dateinamenerweiterung.
  • GUID_1 kann eine beliebige neue GUID sein, die für diese Erweiterung generiert wird.
  • 89BCB740-6119-101A-BCB7-00DD010655AF ist die IFilter-Schnittstellen-GUID, die eine Konstante für alle IFilter-Implementierungen ist.
  1. Registrieren Sie den persistenten Handler für die Dateinamenerweiterung mit den folgenden Schlüsseln und Werten:

    HKEY_CLASSES_ROOT\<.ext>\PersistentHandler
       (Default) = {GUID_1}
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}
       (Default) = <Persistent Handler Description>
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered
       (Default) = (Value Not Set)
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered\{89BCB740-6119-101A-BCB7-00DD010655AF}
       (Default) = {CLSID of IFilter implementation}
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentHandler
       (Default) = {GUID_1}
    
  2. Registrieren Sie die IFilter-Implementierung mit den folgenden Schlüsseln und Werten:

    HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}
       (Default) = Extension IFilter Description">
    
    HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}\InprocServer32
       (Default) = <DLL Install Path>
       ThreadingModel = Both
    
  3. Registrieren Sie die IFilter-Implementierung bei der Windows-Desktopsuche mit dem folgenden Schlüssel und Wert:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Extension\<.ext>
       (Default) = {CLSID of IFilter implementation}"
    

Referenz

SchemaTable

Wahrgenommene Typen

Entwickeln von Protokollhandlern

Andere Ressourcen

Ifilter