Implementieren von Filterhandlern in Windows Suche

Es ist wichtig, dass Sie die erforderliche DLL-Struktur eines Filterhandlers (eine Implementierung der IFilter-Schnittstelle ) verstehen.

Dieses Thema wird wie folgt organisiert:

Implementieren und Exportieren der DLL-Einstiegspunkte

Jede IFilter-DLL (die von Ifilter.dll in diesem Abschnitt bezeichnet wird) müssen die folgenden Einstiegspunkte implementieren und exportieren. Diese Einstiegspunkte werden in der Regel mithilfe einer Moduldefinitionsdatei (.def) für die IFilter-Schnittstelle oder mithilfe des Schlüsselworts __declspec(dllexport) exportiert. Die DLL-Datei kann in einem beliebigen Ordner registriert werden, befindet sich jedoch in der Regel im Ordner %SystemRoot%\system32.

DLL-Einstiegspunkte werden in der folgenden Tabelle aufgeführt und beschrieben.

DLL-Name DLL-Beschreibung
Dllregisterserver Der DllRegisterServer-Einstiegspunkt registriert die DLL als Filter in der Registrierung. Sie registrieren die DLL, indem Sie das regsvr32.exe Programm mit dem Dateinamen der IFilter-Schnittstellen-DLL als Argument ausführen:regsvr32.exe %SystemRoot%\system32\Ifilter.dll
DllUnregisterServer-Funktion Der Einstiegspunkt "DllUnregisterServer-Funktion " entfernt die DLL als persistenter Handler in der Registrierung. Sie heben die Registrierung der DLL auf, indem Sie das regsvr32.exe Programm mit der /u Kennzeichnung ausführen: regsvr32.exe /u %SystemRoot%\system32\Ifilter.dll
DllGetClassObject-Funktion Der Inhaltsindizierungsclient ruft den Einstiegspunkt "DllGetClassObject-Funktion " über das Component Object Model (COM) auf, um ein Klassen-Factoryobjekt für die IFilter-Schnittstelle zu erstellen und einen Zeiger auf die Klassenfabrikschnittstelle dieses Objekts abzurufen.
DllCanUnloadNow-Funktion Der Inhaltsindizierungsclient ruft den DllCanUnloadNow Function-Einstiegspunkt über COM auf, um zu bestimmen, ob es möglich ist, die IFilter-DLL zu entladen. Die IFilter-Schnittstelle wird entladen, nachdem sie für ein Zeitintervall nicht verwendet wurde, wie durch den Registrierungswert FilterIdleTimeOut angegeben.

Implementieren der IFilter-Klasse und der Klassen factory

Mindestens zwei Klassen, z. B. CFilter und CFilterCF , werden in der Regel von jeder IFilter-DLL implementiert. Die CFilter-Klasse erzeugt das IFilter-Schnittstellenobjekt , das die Inhaltsfilterfunktion implementiert. Seine Memberfunktionen implementieren die Schnittstellenmethoden der IFilter-Schnittstelle . Jede IFilter-Klasse erfordert einen eindeutigen Klassenbezeichner (CLSID), den die IFilter-Schnittstelle implementiert.

Die CFilterCF-Klasse erzeugt das Class-Factory-Objekt für die IFilter-Schnittstelle . Die Klassenfabrik wird über die IClassFactory-Schnittstelle durch den DllGetClassObject Function-Einstiegspunkt der DLL aufgerufen. Die CFilterCF-Klasse erstellt das CFilter-Objekt und gibt einen Zeiger auf IUnknown zurück. In komplexeren Fällen kann ein IFilter eine Klassenhierarchie anstelle der einzelnen CFilter-Klasse implementieren.

Erben der COM-Schnittstellen

Windows Search 3.0 und höher erfordern, dass Sie IPersistStream aus folgenden Gründen verwenden:

Diese Schnittstellen werden in Dateien deklariert, die aus dem Verzeichnis "mssdk\include" enthalten sind und über vordefinierte Schnittstellenbezeichner (IIDs) verfügen. Der Inhaltsindizierungsclient fragt die IFilter-Schnittstelle über IUnknown ab, um zu bestimmen, welche dieser Schnittstellen beim Filtern von Inhalten verwendet werden sollen.

Implementieren der COM-Schnittstellenmethoden

Die IFilter-Schnittstelle implementiert die IUnknown-Methoden sowohl für die IFilter-Schnittstellenklasse als auch für die IFilter-Schnittstellenklasse factory. In der folgenden Tabelle sind die schnittstellenspezifischen IFilter-Schnittstellen und Methoden aufgeführt, die die IFilter-Schnittstelle implementieren soll. Die IFilter-Schnittstelle muss mindestens IPersistStream implementieren, kann aber zusätzliche IPersist-abgeleitete Schnittstellen implementieren.

COM-Schnittstelle Methode
IClassFactory-Schnittstelle CreateInstance, LockServer
IClassFactory2-Schnittstelle GetLicInfo, RequestLicKey, CreateInstanceLic
Ifilter IFilter::Init, IFilter::GetChunk, IFilter::GetText, IFilter::GetValue, IFilter::BindRegion
IPersist-Schnittstelle Getclassid
IPersistFile-Schnittstelle IsDirty, Load, Save, SaveCompleted, GetCurFile
IPersistStorage-Schnittstelle IsDirty, Load, Save, GetSizeMax
Ipersiststream IsDirty, Load, Save, GetSizeMax

Die Referenzseite für jede Methode gibt die Parameter und das funktionale Verhalten für diese Methode an. Jede Referenzseite gibt auch den Ergebniscodes, die für diese Methode implementiert werden sollen. Die Referenzseiten für die IFilter-Methoden weisen die schnittstellenspezifischen Codes in FACILITY_ITF Ergebniscodes zur Implementierung zu, und der Inhaltsindizierungsclient kann auch alle generischen Ergebniscodes verarbeiten, z. B. FACILITY_NULL und FACILITY_WIN32. Weitere Informationen finden Sie unter Struktur der COM-Fehlercodes.

COM-Methoden, die nicht implementiert sind

Die IFilter-Schnittstelle muss mindestens IPersistStream implementieren, muss jedoch keine zusätzlichen IPersist-abgeleiteten Schnittstellen implementieren.

Windows Suche muss die in der folgenden Tabelle aufgeführten COM-Methoden nicht implementieren.

Methode, die nicht erforderlich ist Beschreibung
IPersistStream::IsDirty Filter sollten E_NOTIMPL zurückgeben.
IPersistStream::Save Filter sollten E_NOTIMPL zurückgeben.
IPersistStream::GetSizeMax Filter sollten E_NOTIMPL zurückgeben.
IFilter::BindRegion Filter sollten E_NOTIMPL zurückgeben.

Weitere Ressourcen

Entwickeln von Filterhandlern

Grundlegendes zu Filterhandlern in Windows Suche

Bewährte Methoden zum Erstellen von Filterhandlern in Windows Suche

Zurückgeben von Eigenschaften aus einem Filterhandler

Filterhandler, die mit Windows

Registrieren von Filterhandlern

Testen von Filterhandlern