Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az IFilter tesztcsomag ellenőrzi a szűrőkezelőket. A tesztcsomag így tesz: meghívja IFilter metódusokat, és ellenőrzi a visszaadott értékeket, hogy megfeleljenek az IFilter felület specifikációjának; és annak ellenőrzése, hogy az adattömb-azonosítók egyediek és növekednek-e, hogy az IFilter felület következetesen viselkedik-e az újraicializálás után, és hogy az érvénytelen paraméterekkel rendelkező IFilter metódushívások a várt hibakódokat adják vissza. A tesztcsomag-programok egy szűrőkezelő által szűrt fájl kimenetét is kiírják, és ellenőrzik az IFilter regisztrációs adatait a beállításjegyzékben.
Ez a témakör a következőképpen van rendszerezve:
- Command-Line megszólítás
- IFilter-tesztelési eljárás
- A regisztrált elemek indexelésének biztosítása
- További erőforrások
- Kapcsolódó témakörök
Jegyzet
Ha egy meglévő szűrőregisztráció helyett egy fájltípus új szűrőkezelője van telepítve, a telepítőnek mentenie kell az aktuális regisztrációt, és vissza kell állítania, ha az új szűrőkezelőt eltávolítják. Nincs mechanizmus a szűrők láncolatához. Ezért az új szűrőkezelő felelős a régi szűrő szükséges funkcióinak replikálásáért.
Parancssori meghívás
Az IFilter tesztcsomag három parancssori alkalmazásból áll : ifilttst.exe, filtdump.exeés filtreg.exe és inicializálási fájlból, ifilttst.ini.
Fontos
A Windows 7-ben és újabb verziókban a felügyelt kódban írt szűrők kifejezetten le vannak tiltva. A szűrőket natív kódban kell írni, mert lehetséges, hogy a közös nyelvi futtatókörnyezet (CLR) verziószámozási problémái merülnek fel a több bővítmény által futtatott folyamattal kapcsolatban.
Ifilttst.exe
A ifilttst.exe program számos tesztet futtat a szűrőkezelő ellenőrzéséhez. Az alábbi példa bemutatja, hogyan hívhatja meg a ifilttst.exe programot a parancssorból:
ifilttst /i test.htm /l /d /v 1
A példa a következő feladatokat hajtja végre:
- A program utasítása, hogy szűrje a fájlt test.htm
- Átirányítja a naplóüzeneteket a test.htm.log
- Átirányítja a dömp üzeneteket a test.htm.dmp-re.
- A részletességet 1 értékre állítja
Az előző parancs működéséhez három fájlnak kell lennie az aktuális munkakönyvtárban: test.htm, ifilttst.exeés ifilttst.ini. A parancssori kapcsolók az alábbi táblázatban találhatók.
| Váltás és lehetséges változók | Leírás |
|---|---|
| /i fájlnév | A szűrni kívánt bemeneti fájl vagy könyvtár. A fájlnév tartalmazhat helyettesítő karaktereket * és ?. |
| /l | A naplóüzenetek a képernyő helyett egy fájlba lesznek irányítva. A naplóüzenetek az elvégzett egyes teszteket és a tesztek sikeres/sikertelen eredményeit írják le. A naplófájl neve megegyezik a bemeneti fájl nevével, de .log kiterjesztéssel. |
| /d | Az üzenetek a képernyő helyett egy fájlba kerülnek irányításra. A hibakimenet az adattömbök tartalmát írja le. Az adattömb szerkezetét a rendszer akkor dobja ki, ha a részletességi szint 3. A memóriaképfájl neve megegyezik a bemeneti fájl nevével, de .dmp kiterjesztéssel. |
| /-l | Tiltsa le a naplózást. Ez a jelző felülírja a /l kapcsolót. |
| /-d | A dumpolás letiltása. Ez a jelző felülírja a /d kapcsolót. |
| /v egész szám | A részletességi szint. Az alapértelmezett érték 3.
|
| /t egész szám | Az indítandó szálak száma. Az alapértelmezett érték 1. |
| /r egész szám] | Rekurzív módon szűri az alkönyvtárakat. Az opcionális egész szám paraméter határozza meg a rekurziós gyakorlat mélységét. Ha nincs megadva egész szám, vagy ha az egész szám 0, a teljes rekurziót feltételezzük. Alapértelmezés szerint a rekurzió mélysége 1. |
| /c egész szám | A ciklus ismétléseinek száma. Ha az egész szám 0, a teszt ciklusok végtelenek. Alapértelmezés szerint a tesztelési ciklusok csak egyszer futnak. |
Jegyzet
A parancssori kapcsoló és az érték között szóköznek kell lennie.
Filtdump.exe
A filtdump.exe program betölt egy szűrőkezelőt egy adott dokumentumhoz, és kinyomtatja a IFilter DLL által előállított kimenetet. Az alábbi példa bemutatja, hogyan hívhatja meg a filtdump.exe programot.
filtdump filename.ext
Filtdump.exe a ILoadFilter::LoadIFilter metódussal tölti be a megadott fájlnévkiterjesztésnek megfelelő IFilter DLL-t, és kinyomtatja az eredményeket. Az alábbi parancs például arra utasítja filtdump.exe, hogy töltse be a .smp kiterjesztés smpfilt.dll szűrőkezelőjét, bontsa ki az összes szöveget és tulajdonságot a myfile.smp fájlból, és nyomtassa ki az eredményeket.
filtdump myfile.smp
Filtreg.exe
A filtreg.exe program a beállításjegyzékben IFilter telepítési adatait vizsgálja. A filtreg.exe programot a parancssorból a következő példához hasonlóan a nevének beírásával hívhatja meg.
filtreg
Filtreg.exe felsorolja az összes olyan fájlnévkiterjesztést, amelyhez szűrőkezelők vannak társítva a fájlnévkiterjesztés nyomtatásával, valamint a bővítményhez tartozó IFilter DLL nevének nyomtatásával. Ez egy egyszerű módszer egy IFiltermegfelelő telepítésének ellenőrzésére.
Ifilttst.ini
A IFilter felület inicializálása az IFilter::Init metódus meghívásával történik. Az IFilter::Init metódus a következő négy paramétert veszi fel:
- grfFlags
- cTulajdonságok
- aAttribútumok
- pdwFlags
Az IFilter tesztcsomag ifilttst.exe programjának felhasználója megadhatja ezeknek a paramétereknek az értékeit egy ifilttst.ininevű fájlban. Az alábbi táblázat a ifilttst.ini fájl azon bejegyzéseit ismerteti, amelyek az első három paramétert (a bemeneti paramétereket) határozzák meg. A mintafájlokat a Minta ifilttst.ini fájlcímű témakörben talál.
Jegyzet
Nincs táblabejegyzés a pdwFlags paraméterhez, mert ez egy kimeneti paraméter; az IFilter::Initmetódushívása előtt nem kell különleges értékkel rendelkeznie.
| Bejegyzés | Leírás | |
|---|---|---|
| Zászlók | Az OR operátor által az IFilter::Init metódus grfFlags paraméterének létrehozásához csatlakoztatandó IFILTER_INIT jelzők nevei. A jelölőneveknek nagybetűsnek kell lenniük, és ugyanabban a sorban kell lenniük. | |
| cTulajdonságok | A cAttributes paraméter értékét jelölő decimális egész szám. | |
| aAttribútumok | Ennek a bejegyzésnek aAttributes kell kezdődnie, és különböznie kell a szakasz többi aAttributes bejegyzésétől. Az aAttributes bejegyzés jogi nevei a következők: aAttributes, aAttributes1, aAttributes2stb. Az első tokennek GUID-nak kell lennie. A GUID-t pontosan úgy kell formázni, ahogyan az a [Test3] szakaszában látható. A második jogkivonat lehet egy tulajdonságazonosító (PID), amely egy hexadecimális jelölésű számból, vagy egy széles karaktersorozatra mutató mutató (lpwstr) lehet. Az lpwstr úgy adható meg, hogy a karakterláncot idézőjelek közé helyezi, ahogyan az a minta ifilttst.ini fájl [Test6] szakaszában látható. |
Ha a jelzők és a cAttributes bejegyzések nincsenek megadva, akkor az alapértelmezett érték 0. Ha cAttributes értéke 2, két aAttributes nevet kell megadnia. A minta [Test5] szakaszában cAttributes 1, de nincs megadva aAttributes. A teszt ezután meghívja az IFilter::Init metódust, ahol cAttributes értéke 1, és aAttributes értéke NULL. Ez egy hasznos teszteset, mert valószínűleg hozzáférés-megsértést okoz az IFilter::Init metódusban.
Ha ifilttst.exe nem talál ifilttst.ini nevű fájlt a munkakönyvtárban, a rendszer egy alapértelmezett konfigurációval inicializálja a IFilter::Init objektumot. Az alábbi példa az alapértelmezett konfigurációt mutatja be.
[default]
grfFlags = IFILTER_INIT_APPLY_INDEX_ATTRIBUTES
cAttributes = 0
Minta ifilttst.ini fájl
A ifilttst.ini fájl szakaszokba van rendezve, a szakasz neve szögletes zárójelek közé van zárva. A példában a szakaszok neve [Test1], [Test2]stb. Minden szakasznévnek egyedinek kell lennie. A teszt beolvassa az első szakasz értékeit, és inicializálja a IFilter ezekkel az értékekkel. Ezután az összes teszt ezzel a IFilter konfigurációval fut. Ezután a IFilter ki lesz adva és újrainicializálódik a fent felsorolt paraméterek használatával. A folyamat addig ismétlődik, amíg az összes konfiguráció tesztelése meg nem történik.
; 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 teszteljárás
Az IFilter inicializálása után a ifilttst.exe program tesztsorozatot végez az IFilter. Az IFilter tesztelési eljárások követése mellett győződjön meg arról, hogy az IFilter implementációja biztonságos kódeljárásokat alkalmaz. Lásd a "Biztonságos kódkezelési eljárások a Windows Kereséshez" című témakört Szűrőkezelők implementálása a Windows Search.
Érvényesítési teszt
Az érvényesítési teszt egyszerre egy adattömbön halad végig az objektumon, és ellenőrzi az egyes adattömbeket és az összes visszatérési kódot. Az érvényesítési teszt az összes visszaadott STAT_CHUNK struktúrát menti egy listában.
Az érvényesítési teszt a következő feltételeket ellenőrzi:
- A STAT_CHUNK.idChunk adattömb azonosítóinak egyedinek és növekvőnek kell lenniük.
- A STAT_CHUNK.jelzők paraméter felismert adattömbállapot, például CHUNKSTATE, CHUNK_TEXT vagy CenabledHUNK_VALUE konstans.
- A STAT_CHUNK.breakType paraméter felismert töréstípus (0, 1, 2, 3, 4).
- Ha az IFilter inicializálási attribútumok megadják, hogy az IFilter csak belső érték típusú tulajdonságokat tartalmazó adattömböket adjon vissza, akkor idChunkSource értéke 0.
- Ha az adattömb nem származtatott, azaz nem egy belső értéktípusú tulajdonság, akkor STAT_CHUNK.idChunkSource értéke egyenlőnek kell lennie STAT_CHUNK.idChunk.
- IFilter::GetChunk S_OK vagy más elfogadható visszatérési értéket ad vissza, például FILTER_E_END_OF_CHUNKS, FILTER_E_LINK_UNAVAILABLE stb.
- Ha az adattömb szöveget tartalmaz, IFilter::GetText S_OK, FILTER_S_LAST_TEXT vagy FILTER_E_NO_MORE_TEXT ad vissza.
- Ha IFilter::GetText FILTER_S_LAST_TEXT ad vissza, az IFilter::GetText következő hívása FILTER_E_NO_MORE_TEXT ad vissza.
- Ha az adattömb tartalmaz egy értéket, IFilter::GetValue S_OK vagy FILTER_E_NO_MORE_VALUES ad vissza.
Konzisztenciateszt
A ifilttxt.exe program újra inicializálja az IFilter felületet ugyanazokkal a paraméterekkel, mint az érvényesítési tesztben, és konzisztenciatesztet végez. Ha az IFilter implementációja inicializálva lett a IFILTER_INIT IFILTER_INIT_INDEXING_ONLY jelzővel, a teszt felszabadítja a IFilter felületet, és újraköti, mielőtt újabb hívást indít az IFilter::Init metódusra.
A konzisztenciateszt a következő feltételeket ellenőrzi:
- Az IFilter::GetChunkmetódus által visszaadott mindenSTAT_CHUNK struktúra megegyezik az érvényesítési tesztben visszaadott megfelelő STAT_CHUNK.
- IFilter::GetChunk S_OK vagy más elfogadható visszatérési értéket ad vissza, például FILTER_E_END_OF_CHUNKS, FILTER_E_LINK_UNAVAILABLE stb.
Érvénytelen bemeneti teszt
A ifilttst.exe program újra inicializálja az IFilter felületet ugyanazokkal a paraméterekkel, és érvénytelen bemeneti tesztet hajt végre. Ez a teszt lépésről lépésre végighalad a dokumentumon, egyenként egy blokkon végezve helytelen függvényhívásokat, például meghívja a IFilter::GetValue metódust, amikor az aktuális blokk szöveget tartalmaz. A teszt ellenőrzi az összes visszatérési kódot az IFilter specifikációjának való megfelelés érdekében.
Az érvénytelen bemeneti teszt a következő feltételeket ellenőrzi:
- Ha az aktuális adattömb szöveget tartalmaz, IFilter::GetValue FILTER_E_NO_VALUES ad vissza, és az IFilter::GetTexthívása sikeres lesz.
- Ha az aktuális adattömb tartalmaz egy értéket, IFilter::GetText FILTER_E_NO_TEXT ad vissza, és az IFilter::GetValuehívása sikeres lesz.
- Ha az IFilter::GetText előző hívása FILTER_E_NO_MORE_TEXT eredményt adott vissza, az ezt követő IFilter::GetText hívások szintén FILTER_E_NO_MORE_TEXT-ot adnak vissza.
- Ha az IFilter::GetValueelőzőhívása FILTER_E_NO_MORE_VALUES adott vissza , az IFilter::GetValue hívása FILTER_E_NO_MORE_VALUES.
- Ha az előző hívás az IFilter::GetChunk FILTER_E_END_OF_CHUNKS eredményt adott, az utána következő IFilter::GetChunk hívások is FILTER_E_END_OF_CHUNKS eredményt adnak vissza.
Jegyzet
Az érvénytelen bemeneti teszt összehasonlítja az aktuális adattömbstruktúrákat az érvényesítési tesztben visszaadott szerkezetekkel, hogy meggyőződjön arról, hogy azonosak.
Különböző IFilter-konfigurációk tesztelése
A ifilttst.exe program kiadja a IFilter felületet és újrakötést hajt végre, ezúttal a következő paraméterkészlettel inicializálva azt. A teszt megismétli a ciklust: érvényesítési teszt, konzisztenciateszt és érvénytelen bemeneti teszt, amíg a kívánt IFilterifilttst.ini fájlban megadott konfigurációkat nem tesztelték.
A regisztrált elemek indexeltségének biztosítása
Az IFilter- utolsó tesztje biztosítja, hogy a IFilter megfelelően regisztrálva legyen, és hogy a rendszer meghívja a használathoz regisztrált elemek indexelésére. A Katalóguskezelővel újraindexelheti az indexelést, vagy a bejárási hatókör-kezelővel (CSM) beállíthatja az indexelő által bejárni kívánt URL-címeket jelző alapértelmezett szabályokat. Az indexelés befejezése után a Windows Search felhasználói felületén keressen egy sztringet az elemek tartalmában vagy tulajdonságaiban. Ha indexelték az elemeket, azok megjelennek a keresési eredmények között.
További információ az újraindexelésről: A Catalog Manager használata és A Crawl Scope Managerhasználata. A ReindexMatchingUrls kódminta bemutatja, hogy miként és hogyan lehet újraindexelni a fájlokat. A CrawlScopeCommandLine kódminta bemutatja, hogyan definiálhat parancssori beállításokat a Bejárási hatókörkezelő (CSM) indexelési műveleteihez. Mindkét kódminta elérhető GitHub.
Minta naplófájl
Kérésre a Ifilttst.exe program létrehozhat egy naplót, amely tartalmazza a végrehajtás során végrehajtandó lépések leírását. Az alábbi példák egy naplófájl kivonatai, amelyek részletessége a lehető legmagasabb 3 értékre van állítva.
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.
Az első sor egy tájékoztató üzenet, amely azt jelzi, hogy egy új konfiguráció lett betöltve a ifilttst.ini fájlból. A (3) sor annak a ifilttst.ini fájlnak a szakasznevét jelzi, amelyből az aktuális konfiguráció beolvasva lett. A (4) és (7) sorok felsorolják az IFilter::Initparamétereket. A INFO kezdődő sorok tájékoztató üzenetek az IFilter- kötéséről és az érvényesítési teszt kezdetéről. A PASS-val kezdődő sorok olyan üzeneteket tartalmaznak, amelyek arról szólnak, hogy az adott tesztek sikeresen teljesültek.
A következő napló példában szereplő sor egy figyelmeztetés. A figyelmeztetések felhívják a figyelmet IFilter viselkedésre, amely problémás, bár jogi. Ez a figyelmeztetés azt jelzi, hogy a IFilter::GetChunk metódus visszaadott egy szöveges adattömbet, amely nem tartalmaz szöveget.
WARNING-First call to GetText() returned FILTER_E_NO_MORE_TEXT.
Az alábbi példahiba azt jelzi, hogy az IFilter nem kért adattömböket adott ki.
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
Ebben a példában megjelenő hibaüzenet esetében az IFilter egy 0x5PID-vel rendelkező adattömbet bocsátott ki. A ifilttst.ini szakasz [Test1] vizsgálata azt mutatja, hogy a IFilter úgy lett konfigurálva, hogy ne bocsátjon ki adattömböket ezzel a PID-vel. Ha például sem IFILTER_INIT_APPLY_INDEX_ATTRIBUTES, sem IFILTER_INIT_APPLY_OTHER_ATTRIBUTES nincs megadva a Jelzők bejegyzésben, és ha cAttributes 0, akkor IFilter csak 0x13 PID-vel rendelkező és PID_STG_CONTENTS megfelelő adattömböket bocsát ki.
Mintaképfájl
Kérésre a Ifilttst.exe program létrehozhat egy kiíratot, amely tartalmazza a megtalált részeket és azok tartalmát. Az alábbi példa egy részlet egy ilyen memóriaképfájlból.
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
Az első kilenc sor az aktuális adattömb szerkezetét írja le. A GUID és a PID a PSGUID_STORAGE/PID_STG_CONTENTS-nek felelnek meg. Ez egy egyszerű szöveget tartalmazó adattömb. A szöveg a következő adattömbszerkezetben található:
10. This is an HTML IFilter test page
A következő adattömb a 11. sortól kezdve eltérő GUID azonosítóval rendelkezik, amely megfelel a HTML IFilterés egy html HREF-nek megfelelő eltérő PID-nek. Ez egy belső érték típusú tulajdonság, amelyet a HTML IFilterexportál.
A következő adattömb a 21. sortól kezdve ugyanazzal a GUID-jával és PID-jával rendelkezik, de az adattömb állapota VALUETEXThelyett. Vegye figyelembe, hogy az utolsó két adattömb szövege megegyezik az első adattömb szövegével. Mivel azonban az IFilter úgy lett kialakítva, hogy három attribútumot (egyszerű szöveg, HTML HREF szövegként és HTML HREF értékként) lehessen alkalmazni erre a kifejezésre, az eredmények három különálló adattömbként jelennek meg.
További erőforrások
- A GitHub IFilterSample kódmintája bemutatja, hogyan hozhat létre IFilter alaposztályt az IFilter felület implementálásához.
- Az indexelési folyamat áttekintését az Az indexelési folyamatcímű cikkben tekintheti meg.
- A fájltípusok áttekintését a fájltípusokcímű témakörben talál.
- A fájltípus fájltársítási attribútumainak lekérdezéséhez lásd: Észlelttípusok, SystemFileAssociations és alkalmazásregisztráció.
Kapcsolódó témakörök
A Windows Search szűrőkezelőiről
Ajánlott eljárások szűrőkezelők létrehozásához a Windows Keresésben
Tulajdonságok visszaadása szűrőkezelő
Windows rendszerrel együtt szállított szűrőkezelők