Testen von Filterhandlern
Die IFilter-Testsammlung überprüft Ihre Filterhandler. Dazu ruft die Testsammlung IFilter-Methoden auf und überprüft die zurückgegebenen Werte auf Konformität mit der IFilter-Schnittstellenspezifikation. und überprüfen, ob Blockbezeichner eindeutig und zunehmend sind, dass sich die IFilter-Schnittstelle nach der erneuten Initialisierung konsistent verhält und dass alle IFilter-Methodenaufrufe mit ungültigen Parametern erwartete Fehlercodes zurückgeben. Die Testsammlungsprogramme speichern auch die Ausgabe einer Datei, die von einem Filterhandler gefiltert wird, und überprüfen die IFilter-Registrierungsinformationen in der Registrierung.
Dieses Thema ist wie folgt organisiert:
- Befehlszeilenaufruf
- IFilter-Testprozedur
- Sicherstellen, dass registrierte Elemente indiziert werden
- Weitere Ressourcen
- Zugehörige Themen
Hinweis
Wenn ein neuer Filterhandler für einen Dateityp als Ersatz für eine vorhandene Filterregistrierung installiert wird, sollte das Installationsprogramm die aktuelle Registrierung speichern und wiederherstellen, wenn der neue Filterhandler deinstalliert wird. Es gibt keinen Mechanismus zum Verketten von Filtern. Daher ist der neue Filterhandler für die Replikation aller erforderlichen Funktionen des alten Filters verantwortlich.
Command-Line Aufruf
Die IFilter-Testsammlung besteht aus drei Befehlszeilenanwendungen: ifilttst.exe, filtdump.exeund filtreg.exe sowie einer Initialisierungsdatei ifilttst.ini.
Wichtig
In Windows 7 und höher werden in verwaltetem Code geschriebene Filter explizit blockiert. 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.
ifilttst.exe
Das ifilttst.exe Programm führt mehrere Tests aus, um einen Filterhandler zu überprüfen. Im folgenden Beispiel wird veranschaulicht, wie das ifilttst.exe Programm über die Befehlszeile aufgerufen wird:
ifilttst /i test.htm /l /d /v 1
Im Beispiel werden die folgenden Aufgaben ausgeführt:
- Weist das Programm an, die Datei test.htm
- Leitet die Protokollmeldungen an test.htm.log um.
- Leitet die Dumpnachrichten an test.htm.dmp um.
- Legt die Ausführlichkeit auf 1 fest.
Damit der vorherige Befehl funktioniert, müssen sich drei Dateien im aktuellen Arbeitsverzeichnis befinden: test.htm , ifilttst.exeund ifilttst.ini. Befehlszeilenschalter sind in der folgenden Tabelle aufgeführt.
Hinweis
Sie müssen ein Leerzeichen zwischen dem Befehlszeilenschalter und dem Wert einfügen.
filtdump.exe
Das filtdump.exe Programm lädt einen Filterhandler für ein angegebenes Dokument und gibt die von der IFilter-DLL erzeugte Ausgabe aus. Im folgenden Beispiel wird veranschaulicht, wie das filtdump.exe-Programm aufgerufen wird.
filtdump filename.ext
Filtdump.exe verwendet die ILoadFilter::LoadIFilter-Methode, um die für die angegebene Dateinamenerweiterung geeignete IFilter-DLL zu laden, und gibt die Ergebnisse aus. Beispielsweise weist der folgende Befehl filtdump.exe an, den smpfilt.dll Filterhandler für die Erweiterung .smp zu laden, den gesamten Text und die Eigenschaften aus der Datei myfile.smp zu extrahieren und die Ergebnisse zu drucken.
filtdump myfile.smp
filtreg.exe
Das filtreg.exe-Programm überprüft IFilter-Installationsinformationen in der Registrierung. Sie rufen das filtreg.exe Programm über die Befehlszeile auf, indem Sie seinen Namen eingeben, wie im folgenden Beispiel.
filtreg
Filtreg.exe listet alle Dateinamenerweiterungen auf, denen Filterhandler zugeordnet sind, indem sie die Dateinamenerweiterung und den Namen der IFilter-DLL für die Erweiterung drucken. Dies ist eine einfache Möglichkeit, die richtige Installation eines IFilter zu überprüfen.
ifilttst.ini
Eine IFilter-Schnittstelle wird durch Aufrufen der IFilter::Init-Methode initialisiert. Die IFilter::Init-Methode verwendet die folgenden vier Parameter:
- grfFlags
- cAttributes
- aAttributes
- pdwFlags
Der Benutzer des ifilttst.exe Programms der IFilter-Testsammlung kann die Werte für diese Parameter in einer Datei namens ifilttst.ini angeben. In der folgenden Tabelle werden die Einträge in der ifilttst.ini-Datei beschrieben, die die ersten drei Parameter (die Eingabeparameter) angeben. Eine Beispieldatei finden Sie unter Beispiel ifilttst.ini Datei.
Hinweis
Es gibt keinen Tabelleneintrag für den pdwFlags-Parameter, da es sich um einen Ausgabeparameter handelt. vor dem Aufruf der IFilter::Init-Methode muss kein spezieller Wert vorhanden sein.
| Eingabe | Beschreibung |
|---|---|
| Flags | Die Namen der IFILTER _ INIT-Flags, die vom OR-Operator verknüpft werden sollen, um den grfFlags-Parameter der IFilter::Init-Methode zu bilden. Die Flagnamen müssen in Großbuchstaben und in derselben Zeile stehen. |
| cAttributes | Eine ganze Dezimalzahl, die den Wert des cAttributes-Parameters darstellt. |
| aAttributes | Dieser Eintrag muss mit aAttributes beginnen und sich von den anderen aAttributes-Einträgen innerhalb des Abschnitts unterscheiden. Rechtliche Namen für den Eintrag aAttributes sind: aAttributes, aAttributes1, aAttributes2 usw. Das erste Token muss eine GUID sein. Die GUID muss genau wie im [Test3] Abschnitt des Beispiels ifilttst.ini Dateidargestellt formatiert werden. Das zweite Token kann entweder ein Eigenschaftenbezeichner (PID) sein, der aus einer Zahl in Hexadezimalschreibweise besteht, oder ein Zeiger auf eine Breitzeichenfolge (lpwstr). Ein lpwstr kann durch Einschließen der Zeichenfolge in doppelte Anführungszeichen angegeben werden, wie im [Test6] Abschnitt des Beispiels ifilttst.ini Datei veranschaulicht. |
Wenn die Einträge Flags und cAttributes nicht angegeben sind, werden sie standardmäßig auf 0 festgelegt. Wenn Sie cAttributes auf 2 festlegen, sollten Sie zwei aAttributes-Namen angeben. Im [Test5] Abschnitt des Beispiels ist cAttributes 1, aber es wurden keine aAttributes angegeben. Der Test ruft dann die IFilter::Init-Methode mit cAttributes gleich 1 und aAttributes gleich NULL auf. Dies ist ein nützlicher Testfall, da er wahrscheinlich eine Zugriffsverletzung in der IFilter::Init-Methode verursacht.
Wenn ifilttst.exe keine Datei mit dem Namen ifilttst.ini im Arbeitsverzeichnis finden können, wird eine Standardkonfiguration verwendet, um das IFilter::Init-Objekt zu initialisieren. Im folgenden Beispiel wird die Standardkonfiguration veranschaulicht.
[default]
grfFlags = IFILTER_INIT_APPLY_INDEX_ATTRIBUTES
cAttributes = 0
Beispieldatei für ifilttst.ini
Die ifilttst.ini Datei ist in Abschnitten organisiert, wobei der Abschnittsname in eckige Klammern eingeschlossen ist. Im Beispiel heißen die Abschnitte [Test1] , [Test2] usw. Alle Abschnittsnamen müssen eindeutig sein. Der Test liest die Werte aus dem ersten Abschnitt und initialisiert den IFilter mit diesen Werten. Anschließend werden alle Tests mit dieser IFilter-Konfiguration ausgeführt. Anschließend wird der IFilter mithilfe der oben aufgeführten Parameter freigegeben und erneut initialisiert. Der Prozess wird wiederholt, bis alle Konfigurationen getestet wurden.
; Only extract text from the object
[Test1]
Flags =
cAttributes = 0
// Get all attributes (text-type and internal value-type properties.
[Test2]
Flags = IFILTER_INIT_APPLY_INDEX_ATTRIBUTES
cAttributes = 0
// This also extracts just text from the object (the GUID is PSGUID_STORAGE, and the propid is
// PID_STG_CONTENTS).
[Test3]
Flags = IFILTER_INIT_CANON_PARAGRAPHS IFILTER_INIT_HARD_LINE_BREAKS
cAttributes = 1
aAttributes1 = b725f130-47ef-101a-a5f1-02608c9eebac 13
// Only extract requested attribute from the html object (the GUID corresponds to the HTML IFilter.
[Test4]
Flags = IFILTER_INIT_CANON_HYPHENS IFILTER_INIT_CANON_SPACES
cAttributes = 1
aAttributes1 = 70eb7a10-55d9-11cf-b75b-00aa0051fe20 2
// Question: what happens if cAttributes is nonzero, but aAttributes is empty?
[Test5]
Flags = IFILTER_INIT_CANON_SPACES IFILTER_INIT_APPLY_INDEX_ATTRIBUTES IFILTER_INIT_APPLY_OTHER_ATTRIBUTES
cAttributes = 1
// Here is an attribute with a lpwstr instead of a propid (the lpwstr is enclosed in quotes).
// The GUID corresponds to the meta tag clsid for the HTML IFilter.
[Test6]
Flags =
cAttributes = 1
aAttributes1 = D1B5D3F0-C0B3-11CF-9A92-00A0C908DBF1 "GENERATOR"
IFilter-Testprozedur
Nachdem der IFilter initialisiert wurde, führt das ifilttst.exe Programm eine Reihe von Tests für den IFilter durch. Stellen Sie neben den IFilter-Testverfahren sicher, dass Ihre IFilter-Implementierung sichere Codemethoden verwendet. Weitere Informationen finden Sie unter "Sichere Codemethoden für Windows Suche" unter Implementieren von Filterhandlern in Windows Suche.
Validierungstest
Beim Validierungstest wird das Objekt segmentiert durchlaufen, wobei jeder einzelne Block und alle Rückgabecodes überprüft werden. Der Validierungstest speichert alle zurückgegebenen STAT _ CHUNK-Strukturen in einer Liste.
Beim Validierungstest werden die folgenden Bedingungen überprüft:
- Der _ STAT-BLOCK.IdChunk-Block-IDs müssen eindeutig sein und sich erhöhen.
- Der _ STAT-BLOCK.flags-Parameter ist ein erkannter Blockzustand, z. B. CHUNKSTATE-,CHUNK _ TEXT- oder CenabledHUNK _ VALUE-Konstanten.
- Der _ STAT-BLOCK.der breakType-Parameter ist ein erkannter Unterbrechungstyp (0, 1, 2, 3, 4).
- Wenn die IFilter-Initialisierungsattribute angeben, dass der IFilter nur Blöcke zurückgeben soll, die interne Werttypeigenschaften enthalten, muss idChunkSource gleich 0 sein.
- Wenn der Block nicht abgeleitet wird, d. h. wenn es sich nicht um eine interne Werttypeigenschaft handelt, dann STAT _ CHUNK.idChunkSource muss STAT _ CHUNK entsprechen.idChunk.
- IFilter::GetChunk gibt S _ OK oder einen anderen zulässigen Rückgabewert zurück, z. B. FILTER E END OF _ _ _ _ CHUNKS, FILTER _ E LINK _ _ UNAVAILABLE usw.
- Wenn der Block Text enthält, gibt IFilter::GetText S _ OK, FILTER _ S LAST TEXT oder FILTER E NO MORE _ TEXT _ _ _ _ _ zurück.
- Wenn IFilter::GetText FILTER _ S LAST TEXT zurückgibt, gibt der nächste Aufruf von _ _ IFilter::GetText FILTER _ E NO MORE TEXT _ _ _ zurück.
- Wenn der Block einen Wert enthält, gibt IFilter::GetValue S _ OK oder FILTER E NO MORE VALUES _ _ _ _ zurück.
Konsistenztest
Das ifilttxt.exe Programm initialisiert die IFilter-Schnittstelle erneut mit den gleichen Parametern wie im Validierungstest und führt einen Konsistenztest aus. Wenn die IFilter-Implementierung mit dem IFILTER _ INIT IFILTER _ INIT _ INDEXING ONLY-Flag initialisiert _ wurde, gibt der Test die IFilter-Schnittstelle frei und bindet sie erneut, bevor ein weiterer Aufruf der IFilter::Init-Methode erfolgt.
Der Konsistenztest überprüft die folgenden Bedingungen:
- Jede STAT _ CHUNK-Struktur, die von der IFilter::GetChunk-Methode zurückgegeben wird, ist identisch mit der entsprechenden STAT _ CHUNK-Struktur, die im Validierungstest zurückgegeben wird.
- IFilter::GetChunk gibt S _ OK oder einen anderen zulässigen Rückgabewert zurück, z. B. FILTER E END OF _ _ _ _ CHUNKS, FILTER _ E LINK _ _ UNAVAILABLE usw.
Ungültiger Eingabetest
Das ifilttst.exe Programm initialisiert die IFilter-Schnittstelle mit den gleichen Parametern erneut und führt einen ungültigen Eingabetest aus. Bei diesem Test wird das Dokument segmentweise durchlaufen, sodass Funktionsaufrufe falsch sind, z. B. das Aufrufen der IFilter::GetValue-Methode, wenn der aktuelle Chuck Text enthält. Der Test überprüft alle Rückgabecodes auf Konformität mit der IFilter-Spezifikation.
Der ungültige Eingabetest überprüft die folgenden Bedingungen:
- Wenn der aktuelle Block Text enthält, gibt IFilter::GetValue FILTER _ E NO VALUES _ _ zurück, und ein Aufruf von IFilter::GetText ist erfolgreich.
- Wenn der aktuelle Block einen Wert enthält, gibt IFilter::GetText FILTER _ E NO TEXT _ _ zurück, und ein Aufruf von IFilter::GetValue ist erfolgreich.
- Wenn der vorherige Aufruf von IFilter::GetText FILTER E NO MORE TEXT zurückgegeben _ _ _ _ hat, geben aufeinander folgende Aufrufe von IFilter::GetText FILTER _ E NO MORE TEXT _ _ _ zurück.
- Wenn der vorherige Aufruf von IFilter::GetValue FILTER E NO MORE VALUES zurückgegeben _ _ _ _ hat, geben aufeinander folgende Aufrufe von IFilter::GetValue FILTER _ E NO MORE VALUES _ _ _ zurück.
- Wenn der vorherige Aufruf von IFilter::GetChunk FILTER _ E END OF _ CHUNKS zurückgegeben _ _ hat, geben aufeinander folgende Aufrufe von IFilter::GetChunk FILTER _ E END OF _ _ _ CHUNKS zurück.
Hinweis
Der ungültige Eingabetest vergleicht die aktuellen Blockstrukturen mit denen, die im Validierungstest zurückgegeben werden, um sicherzustellen, dass sie identisch sind.
Testen verschiedener IFilter-Konfigurationen
Das ifilttst.exe-Programm gibt die IFilter-Schnittstelle frei und stellt sie wieder her. Dieses Mal wird sie mit dem nächsten Parametersatz initialisiert. Der Test wiederholt den Zyklus: Validierungstest, Konsistenztest und ungültiger Eingabetest, bis alle in ifilttst.ini Datei angegebenen gewünschten IFilter-Konfigurationen getestet wurden.
Sicherstellen, dass registrierte Elemente indiziert werden
Der letzte Test Ihres IFilters stellt sicher, dass Ihr IFilter ordnungsgemäß registriert ist und aufgerufen wird, um die Elemente zu indizieren, die Sie für die Verwendung registriert haben. Sie können den Katalog-Manager verwenden, um eine erneute Indizierung zu initiieren, oder die Durchforstungsbereich-Manager (CSM) verwenden, um Standardregeln einzurichten, die die URLs angeben, die der Indexer durchforsten soll. Verwenden Sie nach Abschluss der Indizierung die Windows Search-Benutzeroberfläche, um im Inhalt oder in den Eigenschaften von Elementen nach einer Zeichenfolge zu suchen. Wenn die Elemente indiziert wurden, werden sie in den Suchergebnissen angezeigt.
Weitere Informationen zur Neuindizierung finden Sie unter Verwenden des Katalog-Managers und Verwenden des Durchforstungsbereich-Manager. Im Codebeispiel ReindexMatchingUrls werden Möglichkeiten veranschaulicht, wie Sie angeben können, welche Dateien wie neu indiziert werden sollen. Im Codebeispiel CrawlScopeCommandLine wird veranschaulicht, wie Befehlszeilenoptionen für csm-Indizierungsvorgänge (Durchforstungsbereich-Manager) definiert werden. Beide Codebeispiele sind auf GitHubverfügbar.
Beispielprotokolldatei
Auf Anforderung kann das Ifilttst.exe-Programm ein Protokoll mit einer Beschreibung der Schritte erstellen, die während der Ausführung ausgeführt werden. Die folgenden Beispiele sind Auszüge aus einer Protokolldatei, wobei die Ausführlichkeit auf den höchsten möglichen Wert 3 festgelegt ist.
1. INFO----**** New configuration ****
2.
3. Section name : Test2
4. grfFlags : 63
5. cAttributes : 0
6. aAttributes : NONE
7. pdwFlags : 0
8.
9. INFO----Successfully bound filter.
10.
11. PASS----Init() returned a valid value for pdwFlags.
12.
13. INFO----Successfully initialized filter.
14.
15. INFO----Performing validation test. In this part of the test, the chunks structures
16. returned by the IFilter are checked for correctness, and the return values
17. of the IFilter calls are checked.
18.
19. PASS----GetChunk() succeeded.
20.
21. PASS----The current chunk has a legal value for the flags field.
Die erste Zeile ist eine Informationsmeldung, die angibt, dass eine neue Konfiguration aus der ifilttst.ini-Datei geladen wurde. Zeile (3) gibt den Abschnittsnamen in der ifilttst.ini Datei an, aus der die aktuelle Konfiguration gelesen wurde. Zeilen (4) bis (7) listen die Parameter für IFilter::Initauf. Die Zeilen, die mit INFO beginnen, sind Informationsmeldungen über die Bindung von IFilter und den Beginn des Validierungstests. Zeilen, die mit PASS beginnen, sind Meldungen zu bestimmten tests, die bestanden wurden.
Die Zeile im folgenden Protokollbeispiel ist eine Warnung. Warnungen rufen die Aufmerksamkeit auf das IFilter-Verhalten auf, das problematisch ist, obwohl es zulässig ist. Diese Warnung gibt an, dass die IFilter::GetChunk-Methode einen Textabschnitt zurückgegeben hat, der keinen Text enthält.
WARNING-First call to GetText() returned FILTER_E_NO_MORE_TEXT.
Die folgende Beispielfehlermeldung gibt an, dass der IFilter einen Block ausgegeben hat, der nicht angefordert wurde.
ERROR---The IFilter has emitted a chunk which it was not requested to emit.
Check the initialization parameters in section Test1 of the initialization file.
INFO----Current chunk propid : 0x5
Im Fall dieser Beispielfehlermeldung hat der IFilter einen Block mit der PID 0x5 ausgegeben. Die Überprüfung des [Test1] Abschnitts in ifilttst.ini zeigt, dass der IFilter so konfiguriert wurde, dass keine Blöcke mit dieser PID ausgegeben werden. Wenn z. B. weder IFILTER _ INIT _ APPLY INDEX ATTRIBUTES _ noch _ IFILTER _ INIT APPLY OTHER ATTRIBUTES im _ _ _ Flags-Eintrag angegeben wurden und cAttributes 0 wären, würde IFilter nur Blöcke mit einer PID von 0x13 ausgeben und dem _ PID-STG-INHALT _ entsprechen.
Beispieldumpdatei
Auf Anforderung kann das Ifilttst.exe Programm ein Dump erstellen, das die gefundenen Blöcke und deren Inhalt enthält. Das folgende Beispiel ist ein Auszug aus einer solchen Dumpdatei.
1. Chunk ID: ........... 2
2. Chunk Break Type: ... END OF SENTENCE
3. Chunk State: ........ TEXT
4. Chunk Locale: ....... 0x411
5. Chunk Source ID: .... 2
6. Chunk Start Source .. 0x0
7. Chunk Length Source . 0x0
8. GUID ................ b725f130-47ef-101a-a5f1-02608c9eebac
9. Property ID ......... 0x13
10. This is a HTML IFilter test page
11. Chunk ID: ........... 3
12. Chunk Break Type: ... END OF SENTENCE
13. Chunk State: ........ TEXT
14. Chunk Locale: ....... 0x411
15. Chunk Source ID: .... 2
16. Chunk Start Source .. 0x0
17. Chunk Length Source . 0x0
18. GUID ................ f29f85e0-4ff9-1068-ab91-08002b27b3d9
19. Property ID ......... 0x2
20. This is a HTML IFilter test page
21. Chunk ID: ........... 4
22. Chunk Break Type: ... END OF SENTENCE
23. Chunk State: ........ VALUE
24. Chunk Locale: ....... 0x411
25. Chunk Source ID: .... 2
26. Chunk Start Source .. 0x0
27. Chunk Length Source . 0x0
28. GUID ................ f29f85e0-4ff9-1068-ab91-08002b27b3d9
29. Property ID ......... 0x2
30. This is an HTML IFilter test page
Die ersten neun Zeilen beschreiben die aktuelle Blockstruktur. Die GUID und die PID entsprechen DEM _ PSGUID-SPEICHER-/PID-STG-INHALT. _ _ Dies ist ein Block, der Nur-Text enthält. Der Text befindet sich in der folgenden Blockstruktur:
10. This is an HTML IFilter test page
Der nächste Block ab Zeile 11 verfügt über eine andere GUID, die dem HTML IFilter entspricht, und eine andere PID, die einem HTML-HREF entspricht. Dies ist eine interne Werttypeigenschaft, die von exportiert HTML IFilter wird.
Der nächste Block, beginnend mit Zeile 21, hat die gleiche GUID und PID, aber sein Blockzustand ist VALUE anstelle von TEXT . Beachten Sie, dass der Text in diesen beiden letzten Blocken mit dem Text für den ersten Block identisch ist. Da der IFilter jedoch für drei Attribute (Nur-Text, HTML HREF als Text und HTML HREF als Wert) konzipiert ist, die auf diesen Ausdruck angewendet werden sollen, werden die Ergebnisse in drei separaten Blocken ausgegeben.
Weitere Ressourcen
- Das IFilterSample-Codebeispiel, das auf GitHub verfügbar ist,veranschaulicht, wie eine IFilter-Basisklasse zum Implementieren der IFilter-Schnittstelle erstellt wird.
- Eine Übersicht über den Indizierungsprozess finden Sie unter Der Indizierungsprozess.
- Eine Übersicht über Dateitypen finden Sie unter Dateitypen.
- Informationen zum Abfragen von Dateiassoziationsattributen für einen Dateityp finden Sie unter PerceivedTypes, SystemFileAssociations und Application Registration.
Zugehörige Themen
Informationen zu Filterhandlern in Windows Search
Bewährte Methoden zum Erstellen von Filterhandlern in Windows Suchen
Zurückgeben von Eigenschaften von einem Filterhandler
Filterhandler, die mit Windows