Filtre işleyicilerini test etme

IFilter test paketi, filtre işleyicilerinizi doğrular. Test paketi bunu şunları yaparak yapar: IFilter yöntemlerini çağırma ve döndürülen değerleri IFilter arabirim belirtimiyle uyumluluk açısından denetleme; ve Öbek tanımlayıcılarının benzersiz ve artan olduğunu denetledikten sonra, IFilter arabiriminin yeniden başlatmadan sonra tutarlı bir şekilde davrandığını ve geçersiz parametrelere sahip IFilter yöntem çağrılarının beklenen hata kodlarını döndürdüğünü denetleyin. Test paketi programları ayrıca, filtre yöneticisi tarafından filtrelenmiş bir dosyanın çıktısını verir ve kayıt defterindeki filtresi ile ilgili kayıt bilgilerini kontrol eder.

Bu konu aşağıdaki gibi düzenlenmiştir:

Not

Mevcut bir filtre kaydının yerine dosya türü için yeni bir filtre işleyicisi yükleniyorsa, yeni filtre işleyicisi kaldırılırsa yükleyicinin geçerli kaydı kaydetmesi ve geri yüklemesi gerekir. Filtreleri zincirleme mekanizması yoktur. Bu nedenle, yeni filtre işleyicisi eski filtrenin gerekli işlevlerini çoğaltmakla sorumludur.

Komut satırı çalıştırma

IFilter test paketi üç komut satırı uygulamasından oluşur: ifilttst.exe, filtdump.exeve filtreg.exe ve ifilttst.inibir başlatma dosyası.

Önemli

Windows 7 ve sonraki sürümlerde, yönetilen kodda yazılan filtreler açıkça engellenir. Birden çok eklentinin çalıştığı işlemle ilgili olası ortak dil çalışma zamanı (CLR) sürüm oluşturma sorunları nedeniyle filtreler yerel kodda yazılmalıdır.

Ifilttst.exe

ifilttst.exe programı, bir filtre işleyicisini doğrulamak için birkaç test çalıştırır. Aşağıdaki örnekte, komut satırından ifilttst.exe programının nasıl çağrıldığı gösterilmektedir:

ifilttst /i test.htm /l /d /v 1

Örnek aşağıdaki görevleri gerçekleştirir:

  • Programı dosya test.htm filtrelemeye yönlendirir
  • Günlük iletilerini test.htm.log dosyasına yönlendirir
  • Döküm iletilerini test.htm.dmp'ye yönlendirir.
  • Ayrıntı düzeyini 1 olarak ayarlar

Yukarıdaki komutun çalışması için geçerli çalışma dizininde üç dosya bulunmalıdır: test.htm, ifilttst.exeve ifilttst.ini. Komut satırı anahtarları aşağıdaki tabloda listelenmiştir.

Anahtar Değiştirici ve olası değişkenler Açıklama
/i dosya adı Filtrelenecek giriş dosyası veya dizin. Dosya adı, * ve ?joker karakterlerini içerebilir.
/l Günlük iletileri ekran yerine bir dosyaya yönlendirilir. Günlük iletileri, gerçekleştirilen tek tek testleri ve testlerin başarılı/başarısız sonuçlarını açıklar. Günlük dosyası adı, giriş dosyası adıyla aynıdır ancak .log uzantısına sahip olur.
/d Döküm iletileri ekran yerine bir dosyaya yönlendirilir. Döküm iletileri öbeklerin içeriğini açıklar. Ayrıntı düzeyi 3 olduğunda öbek yapısı atılır. Döküm dosyası adı, giriş dosyası adıyla aynıdır ancak .dmp uzantısına sahip olur.
/-l Kaydı devre dışı bırakın. Bu bayrak /l anahtarını geçersiz kılar.
/-d Damping'i devre dışı bırakın. Bu bayrak /d anahtarını geçersiz kılar.
/v tamsayı Detaylılık seviyesi. Varsayılan değer 3'dür.
  • 0 - Test yalnızca belirli IFilter arabirim hatalarıyla ilgili iletileri günlüğe kaydeder. Test, parça içeriğini döker.
  • 1 - Test, uyarı iletilerinin yanı sıra düzey 0 için de uyarı iletilerini günlüğe kaydeder.
  • 2 - Test, hem geçirilen testlerle hem de düzey 1 ile ilgili iletileri günlüğe kaydeder.
  • 3 - Test, bilgi iletilerinin yanı sıra düzey 2'ye yönelik iletileri de günlüğe kaydeder. Ek olarak, test öbek yapısını döküm eder.
/t tamsayı Başlatılacak iş parçacığı sayısı. Varsayılan değer 1'dir.
/r tamsayı] Alt dizinleri özyinelemeli olarak filtreler. İsteğe bağlı tamsayı parametresi, özyinelemenin hangi derinliğe kadar gerçekleştirileceğini belirtir. Tamsayı belirtilmezse veya tamsayı 0 ise, tam özyineleme varsayılır. Varsayılan olarak özyineleme derinliği 1'dir.
/c tamsayı Döngü sayısı. Tamsayı 0 ise, test sonsuz döngüler oluşturur. Varsayılan olarak, test yalnızca bir kez döngü oluşturur.

Not

Komut satırı anahtarı ile değer arasına bir boşluk eklemeniz gerekir.

Filtdump.exe

filtdump.exe programı, belirtilen belge için bir filtre işleyicisi yükler ve IFilter DLL tarafından üretilen çıkışı yazdırır. Aşağıdaki örnekte filtdump.exe programının nasıl çağrıldığı gösterilmektedir.

filtdump filename.ext

Filtdump.exe, belirtilen dosya adı uzantısına uygun IFilter DLL'sini yüklemek için ILoadFilter::LoadIFilter yöntemini kullanır ve sonuçları yazdırır. Örneğin, aşağıdaki komut filtdump.exe .smp uzantısı için smpfilt.dll filtre işleyicisini yüklemesini, myfile.smp dosyasındaki tüm metni ve özellikleri ayıklamasını ve sonuçları yazdırmasını sağlar.

filtdump myfile.smp

Filtreg.exe

filtreg.exe programı, kayıt defterindeki IFilter yükleme bilgilerini inceler. Aşağıdaki örnekte olduğu gibi adını yazarak komut satırından filtreg.exe programını çağırırsınız.

filtreg

Filtreg.exe, dosya adı uzantısını ve uzantı için IFilter DLL adını yazdırarak, filtre işleyicileriyle ilişkili olan tüm dosya adı uzantılarını numaralandırır. Bu, IFilterdoğru yüklemesini doğrulamanın basit bir yoludur.

Ifilttst.ini

IFilter arabirimi, IFilter::Init yöntemi çağrılarak başlatılır. IFilter::Init yöntemi aşağıdaki dört parametreyi alır:

  1. grfFlags
  2. cAttributes
  3. aÖzellikler
  4. pdwFlags

IFilter test paketinin ifilttst.exe programının kullanıcısı, bu parametrelerin değerlerini ifilttst.iniadlı bir dosyada belirtebilir. Aşağıdaki tabloda, ifilttst.ini dosyasındaki ilk üç parametreyi (giriş parametreleri) belirten girişler açıklanmaktadır. Örnek dosya için bkz. Örnek ifilttst.ini Dosyası.

Not

pdwFlags parametresi bir çıkış parametresi olduğundan tablo girişi yoktur; IFilter::Init yöntemine çağrı yapılmadan önce özel bir değere sahip olması gerekmez.

  Giriş Açıklama
Bayrak IFilter::Init yönteminin grfFlags parametresini oluşturmak için OR işleci tarafından birleştirilecek IFILTER_INIT bayraklarının adları. Bayrak adlarının tümü büyük harfli ve aynı satırda olmalıdır.
cAttributes cAttributes parametresinin değerini temsil eden ondalık tamsayı.
aÖzellikler Bu girdi, aAttributes ile başlamalıdır ve bölümdeki diğer aAttributes girdilerinden farklı olmalıdır. aAttributes girişinin yasal adları şunlardır: aAttributes, aAttributes1, aAttributes2vb. İlk belirteç bir GUID olmalıdır. GUID, [Test3] bölümünde gösterildiği gibi biçimlendirilmelidir. İkinci belirteç, on altılık gösterimde bir sayıdan oluşan bir özellik tanımlayıcısı (PID) veya bir geniş karakter dizesi işaretçisi (lpwstr) olabilir. Örnek ifilttst.ini Dosyasının [Test6] bölümünde gösterildiği gibi, dize çift tırnak içine alınarak lpwstr olarak belirtilebilir.

Bayraklar ve cAttributes girdileri belirtilmezse, varsayılan olarak 0 olur. cAttributes 2 olarak ayarlarsanız, iki aAttributes adını belirtmeniz gerekir. Örneğin [Test5] bölümünde cAttributes 1'dir, ancak aAttributes belirtilmedi. Daha sonra test, IFilter::Init yöntemini, cAttributes 1'e eşit ve aAttributesNULLeşit olacak şekilde çağırır. IFilter::Init yönteminde erişim ihlaline neden olabileceğinden bu yararlı bir test çalışmasıdır.

ifilttst.exe çalışma dizininde ifilttst.ini adlı bir dosya bulamazsa, IFilter::Init nesnesini başlatmak için varsayılan bir yapılandırma kullanılır. Aşağıdaki örnekte varsayılan yapılandırma gösterilmektedir.

[default]
            grfFlags = IFILTER_INIT_APPLY_INDEX_ATTRIBUTES
            cAttributes = 0

Örnek ifilttst.ini dosyası

ifilttst.ini dosyası bölümler halinde düzenlenir ve bölüm adı köşeli ayraç içine alınır. Örnekte bölümler [Test1], [Test2]vb. olarak adlandırılır. Tüm bölüm adları benzersiz olmalıdır. Test, ilk bölümdeki değerleri okur ve bu değerlerle IFilter başlatır. Ardından tüm testler bu IFilter yapılandırması kullanılarak çalıştırılır. Ardından IFilter serbest bırakılır ve yukarıda listelenen parametreler kullanılarak yeniden başlatılır. Tüm yapılandırmalar test edilene kadar işlem yinelenir.

; 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 test prosedürü

IFilter başlatıldıktan sonra, ifilttst.exe programı IFilterüzerinde bir dizi test yürütür. IFilter test yordamlarını takip etmeye ek olarak, IFilter uygulamanızın güvenli kod uygulamalarına sahip olduğundan emin olun. Windows Search 'de Filtre İşleyicileri Uygulama'da "Windows Search için Güvenli Kod Uygulamaları" bölümüne bakın.

Doğrulama testi

Doğrulama testi, her bir öbek ve tüm dönüş kodlarını doğrulayarak nesnede bir öbek üzerinde adım adım ilerler. Doğrulama testi, döndürülen tüm STAT_CHUNK yapılarını bir listeye kaydeder.

Doğrulama testi aşağıdaki koşulları doğrular:

  • STAT_CHUNK.idChunk öbek kimlikleri benzersiz ve artan olmalıdır.
  • STAT_CHUNK.bayrakları parametresi, CHUNKSTATE, CHUNK_TEXT veya CenabledHUNK_VALUE sabitleri gibi tanınan bir öbek durumudur.
  • STAT_CHUNK.breakType parametresi tanınan bir kesme türüdür (0, 1, 2, 3, 4).
  • IFilter başlatma öznitelikleri IFilter yalnızca iç değer türü özellikleri içeren öbekler döndürmesi gerektiğini belirtiyorsa, idChunkSource 0'a eşit olmalıdır.
  • Öbek türetilmemişse, yani bir iç değer türü özelliği değilse, STAT_CHUNK.idChunkSource, STAT_CHUNK.idChunkile eşit olmalıdır.
  • IFilter::GetChunk S_OK veya FILTER_E_END_OF_CHUNKS, FILTER_E_LINK_UNAVAILABLE vb. gibi kabul edilebilir başka bir dönüş değeri döndürür.
  • Öbek metin içeriyorsa, IFilter::GetText S_OK, FILTER_S_LAST_TEXT veya FILTER_E_NO_MORE_TEXT döndürür.
  • IFilter::GetText FILTER_S_LAST_TEXT döndürürse, sonraki IFilter::GetText çağrısı FILTER_E_NO_MORE_TEXT döndürür.
  • Öbek bir değer içeriyorsa, IFilter::GetValue S_OK veya FILTER_E_NO_MORE_VALUES döndürür.

Tutarlılık testi

ifilttxt.exe programı, IFilter arabirimini doğrulama testindeki parametrelerle yeniden başlatır ve bir tutarlılık testi gerçekleştirir. IFilter uygulaması IFILTER_INIT IFILTER_INIT_INDEXING_ONLY bayrağıyla başlatıldıysa, test IFilter arabirimini serbest bırakır ve IFilter::Init yöntemine başka bir çağrı yapmadan önce yeniden bağlar.

Tutarlılık testi aşağıdaki koşulları doğrular:

  • IFilter::GetChunk yöntemi tarafından döndürülen her STAT_CHUNK yapısı, doğrulama testinde döndürülen ilgili STAT_CHUNK aynıdır.
  • IFilter::GetChunk S_OK veya FILTER_E_END_OF_CHUNKS, FILTER_E_LINK_UNAVAILABLE vb. gibi kabul edilebilir başka bir dönüş değeri döndürür.

Geçersiz giriş testi

ifilttst.exe programı, IFilter arabirimini aynı parametrelerle yeniden başlatır ve geçersiz bir giriş testi gerçekleştirir. Bu test, işlev çağrılarını doğru yapmadan, belgede her seferinde bir öbek ilerleyerek adım adım ilerler; örneğin, geçerli öbek metin içerdiğinde IFilter::GetValue yöntemini çağırmak gibi. Test, IFilter belirtimiyle uyumluluk için tüm dönüş kodlarını denetler.

Geçersiz giriş testi aşağıdaki koşulları doğrular:

  • Geçerli öbek metin içeriyorsa, IFilter::GetValue FILTER_E_NO_VALUES döndürür ve IFilter::GetText çağrısı başarılı olur.
  • Geçerli öbek bir değer içeriyorsa, IFilter::GetText FILTER_E_NO_TEXT döndürür ve IFilter::GetValue çağrısı başarılı olur.
  • Önceki IFilter::GetText çağrısı FILTER_E_NO_MORE_TEXT döndürdüyse, ardışık IFilter::GetText çağrıları FILTER_E_NO_MORE_TEXT döndürür.
  • Önceki çağrı IFilter::GetValue FILTER_E_NO_MORE_VALUES döndürdüyse, IFilter::GetValue ardışık çağrılar FILTER_E_NO_MORE_VALUES döndürür.
  • Önceki çağrıda IFilter::GetChunk FILTER_E_END_OF_CHUNKS döndürdüyse, bundan sonraki IFilter::GetChunk çağrıları da FILTER_E_END_OF_CHUNKS döndürür.

Not

Geçersiz giriş testi, geçerli öbek yapılarını doğrulama testinde döndürülenlerle karşılaştırarak özdeş olduklarından emin olur.

Farklı IFilter yapılandırmalarını test etme

ifilttst.exe programı, IFilter arabirimini serbest bırakır ve yeniden bağlayarak bu kez sonraki parametre kümesiyle başlatır. Test, ifilttst.ini dosyasında belirtilen tüm istenen IFilter yapılandırmaları test edilene kadar döngüyü yineler: doğrulama testi, tutarlılık testi ve geçersiz giriş testi.

Kayıtlı öğelerin dizine alınmasını sağlama

IFilter son testi, IFilter düzgün bir şekilde kaydedilmesini ve kullanmak üzere kaydettiğiniz öğelerin dizinini oluşturmak için çağrılmasını sağlar. Yeniden dizin oluşturmayı başlatmak için Katalog Yöneticisi'ni veya dizin oluşturucunun gezinmesini istediğiniz URL'leri belirten varsayılan kuralları ayarlamak için Gezinme Kapsamı Yöneticisi'ni (CSM) kullanabilirsiniz. Dizin oluşturma tamamlandıktan sonra, öğelerin içeriğinde veya özelliklerinde bir dize aramak için Windows Search kullanıcı arabirimini kullanın. Öğeler dizine alındıysa, arama sonuçlarında görünür.

Yeniden dizin oluşturma hakkında daha fazla bilgi için bkz. Katalog Yöneticisi'ni kullanma ve Gezinme Kapsamı Yöneticisi'ni kullanma. ReindexMatchingUrls kod örneği, hangi dosyaların yeniden dizinleneceğini ve nasıl yapılacağını belirtmenin yollarını gösterir. CrawlScopeCommandLine kod örneği, Gezinme Kapsamı Yöneticisi (CSM) dizin oluşturma işlemleri için komut satırı seçeneklerinin nasıl tanımlanacağı gösterilmektedir. Her iki kod örneği de GitHubüzerinde kullanılabilir.

Örnek günlük dosyası

İstek üzerine, Ifilttst.exe programı yürütme sırasında attığı adımların açıklamasını içeren bir günlük oluşturabilir. Aşağıdaki örnekler, ayrıntı düzeyinin mümkün olan en yüksek değer olan 3 olarak ayarlandığı bir günlük dosyasından alıntılardır.

            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.

İlk satır, ifilttst.ini dosyasından yeni bir yapılandırmanın yüklendiğini gösteren bilgilendiren bir iletidir. Satır (3), geçerli yapılandırmanın okunduğu ifilttst.ini dosyasındaki bölüm adını gösterir. Satırlar (4) ile (7) arasında IFilter::Initparametrelerini listeler. INFO ile başlayan satırlar, IFilter bağlaması ve doğrulama testinin başlangıcı hakkındaki bilgilendirici iletilerdir. PASS ile başlayan satırlar, geçirilen belirli testlerle ilgili iletilerdir.

Aşağıdaki günlük örneğindeki satır bir uyarıdır. Uyarılar, yasal olsa da sorunlu IFilter davranışına dikkat çeker. Bu uyarı, IFilter::GetChunk yönteminin metin içermeyen bir metin öbekleri döndürdüğünü gösterir.

WARNING-First call to GetText() returned FILTER_E_NO_MORE_TEXT.

Aşağıdaki örnek hata iletisi, IFilteristenmeyen bir öbek yaydığını gösterir.

            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

Bu örnek hata iletisinde, IFilter, PID'i 0x5olan bir öbek yaydı. ifilttst.ini'deki bölüm [Test1]'ın bir denetimi, IFilter'ün bu PID ile öbekleri yaymayacak şekilde yapılandırıldığını gösterecektir. Örneğin, Bayraklar girişinde IFILTER_INIT_APPLY_INDEX_ATTRIBUTES veya IFILTER_INIT_APPLY_OTHER_ATTRIBUTES belirtilmemişse ve cAttributes 0 ise IFilter yalnızca 0x13 PID'si olan ve PID_STG_CONTENTS karşılık gelen öbekleri yayar.

Örnek döküm dosyası

İstek üzerine, Ifilttst.exe programı bulduğu öbekleri ve bunların içeriğini içeren bir döküm oluşturabilir. Aşağıdaki örnek, böyle bir döküm dosyasından bir alıntıdır.

                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

İlk dokuz satır geçerli öbek yapısını açıklar. GUID ve PID, PSGUID_STORAGE / PID_STG_CONTENTS karşılık gelir. Bu, düz metin içeren bir öbektir. Metin aşağıdaki öbek yapısındadır:

10. This is an HTML IFilter test page

11. satırdan başlayarak sonraki öbek, HTML IFilterkarşılık gelen farklı bir GUID'ye ve HTML HREF'ye karşılık gelen farklı bir PID'ye sahiptir. Bu, HTML IFiltertarafından dışarı aktarılan bir iç değer türü özelliğidir.

21. satırdan başlayarak sonraki öbek aynı GUID ve PID'ye sahiptir, ancak öbek durumu VALUEyerine TEXT. Bu son iki öbekteki metnin ilk öbekle aynı olduğunu unutmayın. Ancak IFilterbu tümceciğe uygulanacak üç öznitelik (düz metin, metin olarak HTML HREF ve değer olarak HTML HREF) için tasarlandığından, sonuçlar üç ayrı öbek halinde gösterilir.

Ek kaynaklar

Filtre İşleyicileri Geliştirme

Windows Search'te Filtre İşleyicisi Hakkında

Windows Search 'da Filtre İşleyicileri Oluşturmak için En İyi Yöntemler

Filtre İşleyicisinden Özellik Döndürme

Windows ile Birlikte Gelen Filtre İşleyicileri

Windows Search'te Filtre İşleyicilerini Uygulama

Filtre İşleyicilerini Kaydetme