Filterhandlers testen
De IFilter testpakket valideert uw filterhandlers. De testsuite doet dit door: IFilter methoden aanroepen en de geretourneerde waarden controleren op naleving van de IFilter interfacespecificatie; en controleert of segment-id's uniek en toenemend zijn, dat de IFilter-interface interface consistent gedraagt na het opnieuw initialiseren en dat elke IFilter methodeaanroepen met ongeldige parameters verwachte foutcodes retourneert. De testsuiteprogramma's dumpen ook de uitvoer van een bestand dat is gefilterd door een filterhandler en controleer de IFilter registratiegegevens in het register.
Dit onderwerp is als volgt ingedeeld:
- Command-Line aanroep
- Testprocedure IFilter
- ervoor zorgen dat geregistreerde items geïndexeerd worden
- Aanvullende bronnen
- Verwante onderwerpen
Notitie
Als een nieuwe filterhandler voor een bestandstype wordt geïnstalleerd als vervanging voor een bestaande filterregistratie, moet het installatieprogramma de huidige registratie opslaan en herstellen als de nieuwe filterhandler wordt verwijderd. Er is geen mechanisme voor het koppelen van filters. Daarom is de nieuwe filterhandler verantwoordelijk voor het repliceren van de benodigde functionaliteit van het oude filter.
Command-Line Oproep
Het IFilter testpakket bestaat uit drie opdrachtregeltoepassingen: ifilttst.exe, filtdump.exeen filtreg.exe en een initialisatiebestand, ifilttst.ini.
Belangrijk
In Windows 7 en hoger worden filters die zijn geschreven in beheerde code expliciet geblokkeerd. Filters moeten worden geschreven in systeemeigen code vanwege mogelijke clr-versiebeheerproblemen (Common Language Runtime) met het proces waarin meerdere invoegtoepassingen worden uitgevoerd.
ifilttst.exe
Het ifilttst.exe programma voert verschillende tests uit om een filterhandler te valideren. In het volgende voorbeeld ziet u hoe u het ifilttst.exe programma aanroept vanaf de opdrachtregel:
ifilttst /i test.htm /l /d /v 1
In het voorbeeld worden de volgende taken uitgevoerd:
- Het programma wordt geïnstrueerd om het bestand test.htm te filteren.
- Hiermee worden de logboekberichten omgeleid naar test.htm.log
- Hiermee worden de dumpberichten omgeleid naar test.htm.dmp
- De uitgebreidheid instellen op 1
Voordat de voorgaande opdracht werkt, moeten drie bestanden zich in de huidige werkmap bevinden: test.htm
, ifilttst.exeen ifilttst.ini. Schakelopties voor opdrachtregels worden weergegeven in de volgende tabel.
Schakelen en mogelijke variabelen | Beschrijving |
---|---|
/i-bestandsnaam | Het invoerbestand of de invoermap die moet worden gefilterd. De bestandsnaam kan de jokertekens * en ? bevatten. |
/l | Logboekberichten worden doorgestuurd naar een bestand in plaats van het scherm. Logboekberichten beschrijven de afzonderlijke tests die zijn uitgevoerd en de geslaagde/mislukte resultaten van de tests. De naam van het logboekbestand is hetzelfde als de naam van het invoerbestand, maar met een .log-extensie. |
/d | Dumpberichten worden doorgestuurd naar een bestand in plaats van het scherm. Dumpberichten beschrijven de inhoud van de segmenten. De segmentstructuur wordt gedumpt wanneer het uitgebreidheidsniveau 3 is. De naam van het dumpbestand is hetzelfde als de naam van het invoerbestand, maar met een .dmp extensie. |
/-l | Schakel logboekregistratie uit. Met deze vlag wordt de schakeloptie /l buiten werking gesteld. |
/-d | Dumping uitschakelen. Met deze vlag wordt de schakeloptie /d overschreven. |
/v integer | Het uitvoerigheidsniveau. De standaardwaarde is 3.
|
/t geheel getal | Het aantal threads dat moet worden gestart. De standaardwaarde is 1. |
/r integer] | Filtert recursief submappen. De optionele parameter voor gehele getallen geeft de diepte aan waarop recursie moet worden uitgevoerd. Als er geen geheel getal is opgegeven of als het gehele getal 0 is, wordt volledige recursie aangenomen. Standaard is de recursiediepte 1. |
/c int | Het aantal keren om te herhalen. Als het gehele getal 0 is, loopt de testlus oneindig. De testloop wordt standaard slechts één keer uitgevoerd. |
Notitie
U moet een spatie tussen de opdrachtregelswitch en de waarde opnemen.
filtdump.exe
Het filtdump.exe programma laadt een filterhandler voor een opgegeven document en drukt de uitvoer af die wordt geproduceerd door de IFilter DLL. In het volgende voorbeeld ziet u hoe u het filtdump.exe-programma aanroept.
filtdump filename.ext
Filtdump.exe gebruikt de methode ILoadFilter::LoadIFilter om de IFilter DLL te laden die geschikt is voor de opgegeven bestandsnaamextensie en de resultaten af te drukken. Met de volgende opdracht wordt bijvoorbeeld filtdump.exe opdracht gegeven om de smpfilt.dll filterhandler voor de extensie .smp te laden, alle tekst en eigenschappen uit het bestand myfile.smp te extraheren en de resultaten af te drukken.
filtdump myfile.smp
filtreg.exe
Het filtreg.exe programma inspecteert IFilter installatiegegevens in het register. U roept het filtreg.exe programma vanaf de opdrachtregel aan door de naam te typen, zoals in het volgende voorbeeld.
filtreg
Filtreg.exe bevat alle bestandsnaamextensies waaraan filterhandlers zijn gekoppeld door de bestandsnaamextensie en de naam van de IFilter DLL voor de extensie af te drukken. Dit is een eenvoudige manier om de juiste installatie van een IFilterte controleren.
ifilttst.ini
Een IFilter--interface wordt geïnitialiseerd door de methode IFilter::Init aan te roepen. De methode IFilter::Init gebruikt de volgende vier parameters:
- grfFlags
- cAttributes
- aAttributes
- pdwFlags
De gebruiker van het ifilttst.exe-programma van het IFilter testpakket kan de waarden voor deze parameters opgeven in een bestand met de naam ifilttst.ini. In de volgende tabel worden de vermeldingen in het ifilttst.ini-bestand beschreven waarmee de eerste drie parameters (de invoerparameters) worden opgegeven. Zie voorbeeldbestand ifilttst.ini bestandvoor een voorbeeldbestand.
Notitie
Er is geen tabelvermelding voor de pdwFlags parameter omdat het een uitvoerparameter is; deze hoeft geen speciale waarde te hebben vóór de aanroep van de methode IFilter::Init.
Ingang | Beschrijving | |
---|---|---|
Vlaggen | De namen van de IFILTER_INIT vlaggen die moeten worden samengevoegd door de OR-operator om de grfFlags parameter van de IFilter::Init methode te vormen. De vlagnamen moeten allemaal met hoofdletters geschreven zijn en op dezelfde regel staan. | |
cAttributes | Een decimaal geheel getal dat de waarde van de parameter cAttributes vertegenwoordigt. | |
aAttributes | Deze vermelding moet beginnen met aAttributes- en moet afwijken van de andere aAttributes vermeldingen in de sectie. Juridische namen voor de aAttributes vermelding zijn: aAttributes, aAttributes1, aAttributes2, enzovoort. Het eerste token moet een GUID zijn. De GUID moet exact worden opgemaakt zoals wordt geïllustreerd in de sectie [Test3] van het Bestand ifilttst.ini-voorbeeldbestand. Het tweede token kan een eigenschaps-id (PID) zijn die bestaat uit een getal in hexadecimale notatie, of een aanwijzer naar een brede tekenreeks (lpwstr). Een lpwstr kan worden opgegeven door de tekenreeks tussen dubbele aanhalingstekens te plaatsen, zoals wordt geïllustreerd in de sectie [Test6] van het bestand Sample ifilttst.ini. |
Als de vlaggen en cAttributes vermeldingen niet zijn opgegeven, worden deze standaard ingesteld op 0. Als u cAttributes gelijk aan 2 instelt, moet u twee aAttributes namen opgeven. In de [Test5]
sectie van de steekproef is cAttributes 1, maar er zijn geen aAttributes opgegeven. De test roept vervolgens de methode IFilter::Init aan met cAttributes gelijk aan 1 en aAttributes gelijk aan NULL-. Dit is een nuttige testcase omdat dit waarschijnlijk een toegangsfout veroorzaakt in de methode IFilter::Init.
Als ifilttst.exe geen bestand met de naam ifilttst.ini in de werkmap kan vinden, wordt een standaardconfiguratie gebruikt om het IFilter::Init--object te initialiseren. In het volgende voorbeeld ziet u de standaardconfiguratie.
[default]
grfFlags = IFILTER_INIT_APPLY_INDEX_ATTRIBUTES
cAttributes = 0
Voorbeeldbestand ifilttst.ini
Het bestand ifilttst.ini is ingedeeld in secties, met de sectienaam tussen vierkante haken. In het voorbeeld worden de secties [Test1]
, [Test2]
enzovoort genoemd. Alle sectienamen moeten uniek zijn. De test leest de waarden uit de eerste sectie en initialiseert de IFilter met deze waarden. Vervolgens worden alle tests uitgevoerd met behulp van deze IFilter configuratie. Vervolgens wordt de IFilter- vrijgegeven en opnieuw geïnitialiseerd, met behulp van parameters die hierboven worden vermeld. Het proces wordt herhaald totdat alle configuraties zijn getest.
; 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"
Testprocedure voor IFilter
Nadat de IFilter- is geïnitialiseerd, voert het ifilttst.exe programma een reeks tests uit op de IFilter-. Naast het volgen van de testprocedures voor IFilter, moet u ervoor zorgen dat uw IFilter implementatie gebruikmaakt van veilige codeprocedures. Zie 'Beveiligingscodeprocedures voor Windows Search' in Filterhandlers implementeren in Windows Search.
Validatietest
De validatietest doorloopt het object één segment tegelijk, waarbij elke afzonderlijke segment en alle retourcodes worden gecontroleerd. Met de validatietest worden alle geretourneerde STAT_CHUNK structuren in een lijst opgeslagen.
De validatietest controleert de volgende voorwaarden:
- De STAT_CHUNK.idChunk chunk-ID's moeten uniek zijn en toenemen.
- De STAT_CHUNK.vlag parameter is een erkende segmentstatus, zoals CHUNKSTATE, CHUNK_TEXT of CenabledHUNK_VALUE constanten.
- De STAT_CHUNK.parameter breakType is een herkend onderbrekingstype (0, 1, 2, 3, 4).
- Als de IFilter initialisatiekenmerken opgeven dat de IFilter- alleen segmenten met interne eigenschappen van het waardetype moet retourneren, moet idChunkSource- gelijk zijn aan 0.
- Als het segment niet is afgeleid, dat wil zeggen, als het geen interne waardetype-eigenschap is, dan moet STAT_CHUNK.idChunkSource gelijk zijn aan STAT_CHUNK.idChunk.
- IFilter::GetChunk retourneert S_OK of een andere acceptabele retourwaarde, zoals FILTER_E_END_OF_CHUNKS, FILTER_E_LINK_UNAVAILABLE enzovoort.
- Als het segment tekst bevat, retourneert IFilter::GetText S_OK, FILTER_S_LAST_TEXT of FILTER_E_NO_MORE_TEXT.
- Als IFilter::GetText- FILTER_S_LAST_TEXT retourneert, retourneert de volgende oproep naar IFilter::GetText FILTER_E_NO_MORE_TEXT.
- Als het segment een waarde bevat, retourneert IFilter::GetValue S_OK of FILTER_E_NO_MORE_VALUES.
Consistentietest
Het ifilttxt.exe programma initialiseert de IFilter-interface met dezelfde parameters als in de validatietest en voert een consistentietest uit. Als de IFilter-implementatie is geïnitialiseerd met de vlag IFILTER_INIT IFILTER_INIT_INDEXING_ONLY, wordt de IFilter--interface vrijgegeven en opnieuw verbonden voordat er een andere aanroep wordt uitgevoerd naar de IFilter::Init-methode.
De consistentietest controleert de volgende voorwaarden:
- Elke STAT_CHUNK structuur die wordt geretourneerd door de IFilter::GetChunk methode is identiek aan de bijbehorende STAT_CHUNK geretourneerd in de validatietest.
- IFilter::GetChunk retourneert S_OK of een andere acceptabele retourwaarde, zoals FILTER_E_END_OF_CHUNKS, FILTER_E_LINK_UNAVAILABLE enzovoort.
Ongeldige invoertest
Het ifilttst.exe programma initialiseert de IFilter-interface met dezelfde parameters en voert een ongeldige invoertest uit. Deze test doorloopt het document één segment tegelijk waarbij functie-aanroepen onjuist worden uitgevoerd, zoals het aanroepen van de IFilter::GetValue methode wanneer het huidige segment tekst bevat. De test controleert alle retourcodes op naleving van de IFilter specificatie.
De ongeldige invoertest controleert de volgende voorwaarden:
- Als het huidige segment tekst bevat, retourneert IFilter::GetValue FILTER_E_NO_VALUES en wordt er een aanroep naar IFilter::GetText voltooid.
- Als het huidige segment een waarde bevat, retourneert IFilter::GetText- FILTER_E_NO_TEXT en slaagt een aanroep naar IFilter::GetValue.
- Als de vorige aanroep naar IFilter::GetText FILTER_E_NO_MORE_TEXT heeft geretourneerd, dan retourneren opeenvolgende aanroepen naar IFilter::GetText FILTER_E_NO_MORE_TEXT.
- Wanneer de vorige aanroep naar IFilter::GetValue FILTER_E_NO_MORE_VALUES heeft geretourneerd, worden opeenvolgende aanroepen naar IFilter::GetValue FILTER_E_NO_MORE_VALUES geretourneerd.
- Als de vorige aanroep naar IFilter::GetChunk FILTER_E_END_OF_CHUNKS heeft geretourneerd, zullen opeenvolgende aanroepen naar IFilter::GetChunk FILTER_E_END_OF_CHUNKS retourneren.
Notitie
De ongeldige invoertest vergelijkt de huidige segmentstructuren met de segmenten die in de validatietest worden geretourneerd om ervoor te zorgen dat ze identiek zijn.
Verschillende IFilter-configuraties testen
Het ifilttst.exe-programma geeft de IFilter-interface vrij en verbindt opnieuw, waarbij het deze keer met de volgende set parameters wordt geïnitialiseerd. De test herhaalt de cyclus: validatietest, consistentietest en ongeldige invoertest, totdat alle gewenste IFilter configuraties die zijn opgegeven in ifilttst.ini bestand zijn getest.
Ervoor zorgen dat geregistreerde items worden geïndexeerd
De laatste test van uw IFilter- zorgt ervoor dat uw IFilter- correct is geregistreerd en dat deze wordt aangeroepen om de items te indexeren die u hebt geregistreerd om deze te gebruiken. U kunt Catalog Manager gebruiken om het opnieuw indexeren te initiëren of de CSM (Crawl Scope Manager) gebruiken om standaardregels in te stellen die de URL's aangeven die de indexeerfunctie moet verkennen. Nadat het indexeren is voltooid, gebruikt u de Gebruikersinterface van Windows Search om te zoeken naar een tekenreeks in de inhoud of eigenschappen van items. Als de items zijn geïndexeerd, worden ze weergegeven in de zoekresultaten.
Zie Catalogusbeheer gebruiken en Beheer van verkenningsbereik gebruikenvoor meer informatie over het opnieuw indexeren. Het codevoorbeeld ReindexMatchingUrls laat zien hoe u kunt opgeven welke bestanden u opnieuw wilt indexeren en hoe. Het codevoorbeeld CrawlScopeCommandLine laat zien hoe u opdrachtregelopties definieert voor indexeringsbewerkingen van Crawl Scope Manager (CSM). Beide codevoorbeelden zijn beschikbaar op GitHub-.
Voorbeeldlogboekbestand
Op verzoek kan het Ifilttst.exe programma een logboek met een beschrijving maken van de stappen die tijdens de uitvoering worden uitgevoerd. De volgende voorbeelden zijn fragmenten uit een logboekbestand, waarbij de uitgebreidheid is ingesteld op de hoogst mogelijke waarde 3.
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.
De eerste regel is een informatief bericht dat aangeeft dat er een nieuwe configuratie is geladen vanuit het ifilttst.ini-bestand. Regel (3) geeft de sectienaam in het ifilttst.ini-bestand aan waaruit de huidige configuratie is gelezen. Regels (4) tot en met (7) geven de parameters aan IFilter::Init. De regels die beginnen met INFO
zijn informatieve berichten over de binding van de IFilter- en het begin van de validatietest. Regels die beginnen met PASS
zijn berichten met betrekking tot specifieke tests die geslaagd zijn.
De regel in het volgende logboekvoorbeeld is een waarschuwing. Waarschuwingen roepen aandacht op IFilter gedrag dat problematisch is, hoewel juridisch. Deze waarschuwing geeft aan dat de methode IFilter::GetChunk een tekstsegment heeft geretourneerd dat geen tekst bevat.
WARNING-First call to GetText() returned FILTER_E_NO_MORE_TEXT.
Het volgende voorbeeldfoutbericht geeft aan dat het IFilter een segment heeft verzonden dat niet is aangevraagd.
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
In het geval van dit voorbeeldfoutbericht heeft het IFilter een segment met een PID van 0x5
verzonden. Inspectie van sectie [Test1]
in ifilttst.ini zou laten zien dat de IFilter- is geconfigureerd om geen segmenten met deze PID te verzenden. Als bijvoorbeeld niet IFILTER_INIT_APPLY_INDEX_ATTRIBUTES noch IFILTER_INIT_APPLY_OTHER_ATTRIBUTES zijn opgegeven in de vermelding Vlaggen en als cAttributes 0 waren, zou IFilter- alleen segmenten verzenden met een PID van 0x13
en overeenkomend met PID_STG_CONTENTS.
Voorbeelddumpbestand
Op verzoek kan het Ifilttst.exe-programma een dump produceren met de segmenten die worden gevonden en hun inhoud. Het volgende voorbeeld is een fragment uit een dergelijk dumpbestand.
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
De eerste negen regels beschrijven de huidige segmentstructuur. De GUID en de PID komen overeen met PSGUID_STORAGE/PID_STG_CONTENTS. Dit is een segment met tekst zonder opmaak. De tekst bevindt zich in de volgende segmentstructuur:
10. This is an HTML IFilter test page
Het volgende segment, beginnend bij regel 11, heeft een andere GUID, die overeenkomt met de HTML IFilter
en een andere PID, die overeenkomt met een HTML HREF. Dit is een eigenschap van het interne waardetype, geëxporteerd door de HTML IFilter
.
Het volgende segment, beginnend bij regel 21, heeft dezelfde GUID en PID, maar de chunkstatus is VALUE
in plaats van TEXT
. De tekst in deze laatste twee segmenten is hetzelfde als voor het eerste segment. Maar omdat de IFilter- is ontworpen voor drie kenmerken (tekst zonder opmaak, HTML HREF als tekst en HTML HREF als waarde) die op deze zin moeten worden toegepast, worden de resultaten in drie afzonderlijke segmenten verzonden.
Aanvullende informatiebronnen
- Het codevoorbeeld IFilterSample, beschikbaar op GitHub-, laat zien hoe u een IFilter-basisklasse maakt voor het implementeren van de IFilter--interface.
- Zie Het indexeringsprocesvoor een overzicht van het indexeringsproces.
- Zie Bestandstypenvoor een overzicht van bestandstypen.
- Zie PerceivedTypes, SystemFileAssociations en Application Registrationals u een query wilt uitvoeren op kenmerken van bestandskoppelingen voor een bestandstype.
Verwante onderwerpen
Over filterhandlers in Windows Search
aanbevolen procedures voor het maken van filterhandlers in Windows Search
eigenschappen retourneren van een filterhandler
Filterhandlers die met Windows worden geleverd