Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Es ist wichtig, dass Sie die erforderliche DLL-Struktur eines Filterhandlers (eine Implementierung der IFilter-Schnittstelle ) verstehen.
Dieses Thema ist wie folgt organisiert:
- Implementieren und Exportieren der DLL-Einstiegspunkte
- Das Implementieren der IFilter-Klasse und Klassenfabrik
- Vererbung von COM-Schnittstellen
- Implementieren der COM-Schnittstellenmethoden
- Zusätzliche Ressourcen
- Verwandte Themen
Implementieren und Exportieren der DLL-Einstiegspunkte
Jede IFilter-DLL (die von Ifilter.dll in diesem Abschnitt bezeichnet wird) muss 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 der DllUnregisterServer-Funktion entfernt die DLL als beständigen 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 der DllGetClassObject-Funktion über Component Object Model (COM) auf, um ein Klassenfactoryobjekt für die IFilter-Schnittstelle zu erstellen und einen Zeiger auf die Klassenfactoryschnittstelle dieses Objekts abzurufen. |
| DllCanUnloadNow-Funktion | Der Inhaltsindizierungsclient ruft den Einstiegspunkt "DllCanUnloadNow Function " über COM auf, um zu bestimmen, ob das Entladen der IFilter-DLL möglich ist. Die IFilter-Schnittstelle wird entladen, nachdem sie für ein Zeitintervall nicht verwendet wurde, wie durch den Registrierungswert FilterIdleTimeOut angegeben. |
Implementierung der IFilter-Klasse und Klassenfabrik
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. Die Memberfunktionen implementieren die Schnittstellenmethoden der IFilter-Schnittstelle . Jede IFilter-Klasse erfordert einen eindeutigen Klassenbezeichner (CLSID), den die IFilter-Schnittstellenimplementierer generiert.
Die CFilterCF-Klasse erstellt das Klassenfabrikobjekt für die IFilter-Schnittstelle. Die Klassenfabrik wird über ihre IClassFactory-Schnittstelle durch den DllGetClassObject-Funktions-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.
Vererbung von COM-Schnittstellen
Windows Search 3.0 und höher erfordern, dass Sie IPersistStream aus den folgenden Gründen verwenden:
- Um die Leistung und zukünftige Kompatibilität sicherzustellen.
- Um die Sicherheit zu erhöhen. Mit IPersistStream implementierte IFilter sind sicherer, da der Kontext, in dem die IFilter-Schnittstelle ausgeführt wird, nicht die Rechte zum Öffnen von Dateien auf dem Datenträger oder über das Netzwerk benötigt.
- Während Windows Search nur IPersistStream verwendet, kann die IFilter-Schnittstellenklasse auch die IPersistFile-Schnittstelle und/oder IPersistStorage-Schnittstellenimplementierungen für Abwärtskompatibilität erben.
Diese Schnittstellen werden in Dateien deklariert, die aus dem Verzeichnis "mssdk\include" eingebunden 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-Fabrik. In der folgenden Tabelle sind in vtabler Reihenfolge 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 von 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 | AbrufenVonKlassenID |
| 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. Auf jeder Referenzseite werden auch die Ergebniscodes bereitgestellt, die für diese Methode implementiert werden sollen. Auf den Referenzseiten für die IFilter-Methoden werden die schnittstellenspezifischen Codes in FACILITY_ITF zu implementierenden Ergebniscodes bereitgestellt, 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, aber keine zusätzlichen IPersist-abgeleiteten Schnittstellen implementieren.
Windows Search muss die in der folgenden Tabelle aufgeführten COM-Methoden nicht implementieren.
| Methode, die nicht erforderlich ist | Description |
|---|---|
| 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
- Das IFilterSample-Codebeispiel , das auf GitHub verfügbar ist, veranschaulicht, wie eine IFilter-Basisklasse für die Implementierung der IFilter-Schnittstelle erstellt wird.
- Eine Übersicht über den Indizierungsprozess finden Sie unter "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
Grundlegendes zu Filterhandlern in der Windows-Suche
Bewährte Methoden zum Erstellen von Filterhandlern in der Windows-Suche
Zurückgeben von Eigenschaften aus einem Filterhandler
Filterhandler, die mit Windows ausgeliefert werden