필터 처리기 테스트

IFilter 테스트 도구 모음은 필터 처리기의 유효성을 검사합니다. 테스트 도구 모음은 IFilter 메서드를 호출하고 반환된 값을 확인하여 IFilter 인터페이스 사양을 준수합니다. 청크 식별자가 고유하고 증가하는지 확인하고, 다시 초기화한 후 IFilter 인터페이스가 일관되게 동작하고, 잘못된 매개 변수를 사용하는 IFilter 메서드 호출이 예상된 오류 코드를 반환했는지 확인합니다. 또한 테스트 도구 모음 프로그램은 필터 처리기로 필터링된 파일의 출력을 덤프하고 레지스트리에서 IFilter 등록 정보를 검사.

이 항목은 다음과 같이 구성됩니다.

참고

파일 형식에 대한 새 필터 처리기가 기존 필터 등록을 대체하는 것으로 설치되는 경우 설치 관리자는 현재 등록을 저장하고 새 필터 처리기가 제거된 경우 복원해야 합니다. 필터를 연결하는 메커니즘은 없습니다. 따라서 새 필터 처리기는 이전 필터의 필요한 기능을 복제해야 합니다.

Command-Line 호출

IFilter 테스트 도구 모음은 ifilttst.exe, filtdump.exe및filtreg.exe및 초기화 파일인 ifilttst.ini 세 개의 명령줄 애플리케이션으로 구성 됩니다.

중요

Windows 7 이상에서는 관리 코드로 작성된 필터가 명시적으로 차단됩니다. 여러 추가 기능이 실행되는 프로세스의 잠재적인 CLR(공용 언어 런타임) 버전 관리 문제로 인해 필터를 네이티브 코드로 작성해야 합니다.

ifilttst.exe

ifilttst.exe 프로그램은 필터 처리기의 유효성을 검사하기 위해 여러 테스트를 실행합니다. 다음 예제에서는 명령줄에서 ifilttst.exe 프로그램을 호출하는 방법을 보여 줍니다.

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

이 예제에서는 다음 작업을 수행합니다.

  • test.htm 파일을 필터링하도록 프로그램을 지시합니다.
  • 로그 메시지를 test.htm.log로 리디렉션합니다.
  • 덤프 메시지를 test.htm.dmp로 리디렉션합니다.
  • 세부 정보 표시도를 1로 설정합니다.

위의 명령이 작동하려면 현재 작업 디렉터리에 test.htm,ifilttst.exeifilttst.ini세 개의 파일이 있어야 합니다. 명령줄 스위치는 다음 표에 나와 있습니다.

스위치 및 가능한 변수 설명
/i 파일 이름 필터링할 입력 파일 또는 디렉터리입니다. 파일 이름에는 와일드카드 문자 *?가 포함될 수 있습니다.
/L 로그 메시지는 화면 대신 파일로 전달됩니다. 로그 메시지는 수행된 개별 테스트와 테스트의 통과/실패 결과를 설명합니다. 로그 파일 이름은 입력 파일 이름과 동일하지만 확장명은 .log입니다.
/d 덤프 메시지는 화면 대신 파일로 전달됩니다. 덤프 메시지는 청크의 내용을 설명합니다. 청크 구조는 세부 정보 수준이 3이면 덤프됩니다. 덤프 파일 이름은 입력 파일 이름과 동일하지만 확장명은 .dmp입니다.
/-L 로깅을 사용하지 않도록 설정합니다. 이 플래그는 스위치를 재정의 /l 합니다.
/-D 덤핑을 사용하지 않도록 설정합니다. 이 플래그는 스위치를 재정의 /d 합니다.
/v 정수 자세한 정도입니다. 기본값은 3입니다.
  • 0 - 테스트는 특정 IFilter 인터페이스 오류와 관련된 메시지만 기록합니다. 테스트는 청크 콘텐츠를 덤프합니다.
  • 1 - 테스트는 경고 메시지와 수준 0에 대한 메시지를 기록합니다.
  • 2 - 테스트는 통과한 테스트와 관련된 메시지와 수준 1에 대한 메시지를 기록합니다.
  • 3 - 테스트는 정보 메시지와 수준 2에 대한 메시지를 기록합니다. 또한 테스트는 청크의 구조를 덤프합니다.
/t 정수 시작할 스레드 수입니다. 기본값은 1입니다.
/r 정수] 하위 디렉터리를 재귀적으로 필터링합니다. 선택적 정수 매개 변수는 재귀를 연습할 깊이를 지정합니다. 정수 없음을 지정하지 않거나 정수가 0이면 전체 재귀가 가정됩니다. 기본적으로 재귀 깊이는 1입니다.
/c 정수 반복할 횟수입니다. 정수가 0이면 테스트가 무한히 반복됩니다. 기본적으로 테스트는 한 번만 반복됩니다.

참고

명령줄 스위치와 값 사이에 공백을 포함해야 합니다.

filtdump.exe

filtdump.exe 프로그램은 지정된 문서에 대한 필터 처리기를 로드하고 IFilter DLL에서 생성된 출력을 출력합니다. 다음 예제에서는 filtdump.exe 프로그램을 호출하는 방법을 보여 줍니다.

filtdump filename.ext

Filtdump.exe ILoadFilter::LoadIFilter 메서드를 사용하여 지정된 파일 이름 확장명 에 적합한 IFilter DLL을 로드하고 결과를 출력합니다. 예를 들어 다음 명령은 확장 .smp에 대한 smpfilt.dll 필터 처리기를 로드하고, myfile.smp 파일에서 모든 텍스트와 속성을 추출하고, 결과를 인쇄하도록 filtdump.exe 지시합니다.

filtdump myfile.smp

filtreg.exe

filtreg.exe 프로그램은 레지스트리의 IFilter 설치 정보를 검사합니다. 다음 예제와 같이 이름을 입력하여 명령줄에서 filtreg.exe 프로그램을 호출합니다.

filtreg

Filtreg.exe 파일 이름 확장명 및 확장명의 IFilter DLL 이름을 인쇄하여 필터 처리기가 연결된 모든 파일 이름 확장명을 열거합니다. 이는 IFilter의 올바른 설치를 확인하는 간단한 방법입니다.

ifilttst.ini

IFilter 인터페이스는 IFilter::Init 메서드를 호출하여 초기화됩니다. IFilter::Init 메서드는 다음 네 가지 매개 변수를 사용합니다.

  1. grfFlags
  2. cAttributes
  3. aAttributes
  4. pdwFlags

IFilter 테스트 도구 모음의 ifilttst.exe 프로그램 사용자는 ifilttst.ini 라는 파일에서 이러한 매개 변수의 값을 지정할 수 있습니다. 다음 표에서는 처음 세 개의 매개 변수(입력 매개 변수)를 지정하는 ifilttst.ini 파일의 항목에 대해 설명합니다. 샘플 파일은 샘플 ifilttst.ini 파일을 참조하세요.

참고

출력 매개 변수이므로 pdwFlags 매개 변수에 대한 테이블 항목이 없습니다. IFilter::Init 메서드를 호출하기 전에 특별한 값을 가질 필요가 없습니다.

  입력 Description
플래그 IFilter::Init 메서드의 grfFlags 매개 변수를 형성하기 위해 OR 연산자가 조인할 IFILTER_INIT 플래그의 이름입니다. 플래그 이름은 모두 대문자여야 하며 동일한 줄에 있어야 합니다.
cAttributes cAttributes 매개 변수의 값을 나타내는 10진수 정수입니다.
aAttributes 이 항목은 aAttributes 로 시작해야 하며 섹션 내의 다른 aAttributes 항목과 달라야 합니다. aAttributes 항목의 법적 이름은 aAttributes, aAttributes1, aAttributes2 등입니다. 첫 번째 토큰은 GUID여야 합니다. GUID는 샘플 ifilttst.ini 파일의 섹션에 [Test3] 설명된 대로 정확하게 서식을 지정해야 합니다. 두 번째 토큰은 16진수 표기법으로 구성된 PID(속성 식별자) 또는 와이드 문자열(lpwstr)에 대한 포인터일 수 있습니다. 샘플 ifilttst.ini 파일의 섹션에 설명된 [Test6] 대로 문자열을 큰따옴표로 묶어 lpwstr을 지정할 수 있습니다.

Flags 및 cAttributes 항목이 지정되지 않은 경우 기본값은 0입니다. cAttributes를 2로 설정하는 경우 두 개의 aAttributes 이름을 지정해야 합니다. [Test5] 샘플의 섹션에서 cAttributes는 1이지만 aAttributes가 지정되지 않았습니다. 그런 다음, 테스트는 cAttributes가 1이고 aAttributesNULL과 같은 IFilter::Init 메서드를 호출합니다. 이는 IFilter::Init 메서드에서 액세스 위반이 발생할 가능성이 높기 때문에 유용한 테스트 사례입니다.

ifilttst.exe 작업 디렉터리에서 ifilttst.ini 파일을 찾을 수 없는 경우 기본 구성을 사용하여 IFilter::Init 개체를 초기화합니다. 다음 예제에서는 기본 구성을 보여 줍니다.

[default]
            grfFlags = IFILTER_INIT_APPLY_INDEX_ATTRIBUTES
            cAttributes = 0

샘플 ifilttst.ini 파일

ifilttst.ini 파일은 섹션 이름으로 대괄호로 묶인 섹션으로 구성됩니다. 이 예제에서 섹션의 이름은 [Test1], [Test2]등입니다. 모든 섹션 이름은 고유해야 합니다. 테스트는 첫 번째 섹션에서 값을 읽고 해당 값으로 IFilter 를 초기화합니다. 그런 다음 이 IFilter 구성을 사용하여 모든 테스트를 실행합니다. 그런 다음 위에 나열된 매개 변수를 사용하여 IFilter 를 해제하고 다시 초기화합니다. 프로세스는 모든 구성을 테스트할 때까지 반복됩니다.

; 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 테스트 프로시저

IFilter가 초기화된 후 ifilttst.exe 프로그램은 IFilter에서 일련의 테스트를 수행합니다. IFilter 테스트 절차를 따르는 것 외에도 IFilter 구현이 보안 코드 사례를 사용하는지 확인합니다. Windows Search에서 필터 처리기 구현의 "Windows Search에 대한 보안 코드 사례"를 참조하세요.

유효성 검사 테스트

유효성 검사 테스트는 개체를 한 번에 한 청크씩 단계별로 수행하여 각 개별 청크 및 모든 반환 코드를 확인합니다. 유효성 검사 테스트는 반환된 모든 STAT_CHUNK 구조를 목록에 저장합니다.

유효성 검사 테스트는 다음 조건을 확인합니다.

  • STAT_CHUNK. idChunk 청크 ID는 고유하고 증가해야 합니다.
  • STAT_CHUNK. flags 매개 변수는 CHUNKSTATE, CHUNK_TEXT 또는 CenabledHUNK_VALUE 상수와 같은 인식된 청크 상태입니다.
  • STAT_CHUNK. breakType 매개 변수는 인식된 중단 유형(0, 1, 2, 3, 4)입니다.
  • IFilter 초기화 특성에서 IFilter가 내부 값 형식 속성을 포함하는 청크만 반환해야 한다고 지정하는 경우 idChunkSource는 0과 같아야 합니다.
  • 청크가 파생되지 않은 경우 내부 값 형식 속성이 아닌 경우 STAT_CHUNK. idChunkSource는STAT_CHUNK 같아야 합니다. idChunk.
  • IFilter::GetChunk 는 S_OK 또는 FILTER_E_END_OF_CHUNKS, FILTER_E_LINK_UNAVAILABLE 등과 같은 기타 허용 가능한 반환 값을 반환합니다.
  • 청크에 텍스트가 포함된 경우 IFilter::GetText 는 S_OK, FILTER_S_LAST_TEXT 또는 FILTER_E_NO_MORE_TEXT 반환합니다.
  • IFilter::GetText가 FILTER_S_LAST_TEXT 반환하는 경우 IFilter::GetText에 대한 다음 호출은 FILTER_E_NO_MORE_TEXT 반환합니다.
  • 청크에 값이 포함된 경우 IFilter::GetValue 는 S_OK 또는 FILTER_E_NO_MORE_VALUES 반환합니다.

일관성 테스트

ifilttxt.exe 프로그램은 유효성 검사 테스트와 동일한 매개 변수를 사용하여 IFilter 인터페이스를 다시 초기화하고 일관성 테스트를 수행합니다. IFilter 구현이 IFILTER_INIT IFILTER_INIT_INDEXING_ONLY 플래그로 초기화된 경우 테스트는 IFilter 인터페이스를 해제하고 IFilter::Init 메서드를 다시 호출하기 전에 다시 바인딩합니다.

일관성 테스트는 다음 조건을 확인합니다.

  • IFilter::GetChunk 메서드에서 반환되는 각 STAT_CHUNK 구조체는 유효성 검사 테스트에서 반환된 해당 STAT_CHUNK 동일합니다.
  • IFilter::GetChunk 는 S_OK 또는 FILTER_E_END_OF_CHUNKS, FILTER_E_LINK_UNAVAILABLE 등과 같은 기타 허용 가능한 반환 값을 반환합니다.

잘못된 입력 테스트

ifilttst.exe 프로그램은 동일한 매개 변수를 사용하여 IFilter 인터페이스를 다시 초기화하고 잘못된 입력 테스트를 수행합니다. 이 테스트는 현재 척에 텍스트가 포함된 경우 IFilter::GetValue 메서드를 호출하는 등 함수가 잘못 호출되도록 한 번에 한 청크씩 문서를 단계별 실행합니다. 테스트는 모든 반환 코드에서 IFilter 사양을 준수하는지 확인합니다.

잘못된 입력 테스트는 다음 조건을 확인합니다.

  • 현재 청크에 텍스트가 포함된 경우 IFilter::GetValue 는 FILTER_E_NO_VALUES 반환하고 IFilter::GetText 호출이 성공합니다.
  • 현재 청크에 값이 포함된 경우 IFilter::GetText 는 FILTER_E_NO_TEXT 반환하고 IFilter::GetValue 호출이 성공합니다.
  • IFilter::GetText에 대한 이전 호출이 FILTER_E_NO_MORE_TEXT 반환된 경우 IFilter::GetText에 대한 연속 호출은 FILTER_E_NO_MORE_TEXT 반환합니다.
  • IFilter::GetValue에 대한 이전 호출이 FILTER_E_NO_MORE_VALUES 반환된 경우 IFilter::GetValue에 대한 연속 호출은 FILTER_E_NO_MORE_VALUES 반환합니다.
  • IFilter::GetChunk에 대한 이전 호출이 FILTER_E_END_OF_CHUNKS 반환된 경우 IFilter::GetChunk에 대한 연속 호출은 FILTER_E_END_OF_CHUNKS 반환합니다.

참고

잘못된 입력 테스트는 현재 청크 구조를 유효성 검사 테스트에서 반환된 청크 구조와 비교하여 동일한지 확인합니다.

다른 IFilter 구성 테스트

ifilttst.exe 프로그램은 IFilter 인터페이스를 릴리스하고 다시 바인딩합니다. 이번에는 다음 매개 변수 집합을 사용하여 초기화합니다. 테스트는 ifilttst.ini파일에 지정된 모든 원하는 IFilter 구성이 테스트될 때까지 유효성 검사 테스트, 일관성 테스트 및 잘못된 입력 테스트와 같은 주기를 반복합니다.

등록된 항목이 인덱싱되도록 보장

IFilter의 최종 테스트는 IFilter가 제대로 등록되었는지와 IFilter를 사용하기 위해 등록한 항목을 인덱싱하기 위해 호출되는지 확인합니다. 카탈로그 관리자를 사용하여 다시 인덱싱을 시작하거나 CSM(크롤링 범위 관리자)을 사용하여 인덱서가 크롤링할 URL을 나타내는 기본 규칙을 설정할 수 있습니다. 인덱싱이 완료되면 Windows Search UI를 사용하여 항목의 콘텐츠 또는 속성에서 문자열을 검색합니다. 항목이 인덱싱된 경우 검색 결과에 표시됩니다.

다시 인덱싱에 대한 자세한 내용은 카탈로그 관리자 사용크롤링 범위 관리자 사용을 참조하세요. ReindexMatchingUrls 코드 샘플은 다시 인덱싱할 파일과 방법을 지정하는 방법을 보여 줍니다. CrawlScopeCommandLine 코드 샘플에서는 CSM(크롤링 범위 관리자) 인덱싱 작업에 대한 명령줄 옵션을 정의하는 방법을 보여 줍니다. 두 코드 샘플은 모두 GitHub에서 사용할 수 있습니다.

샘플 로그 파일

요청 시 Ifilttst.exe 프로그램은 실행 중에 수행하는 단계에 대한 설명이 포함된 로그를 생성할 수 있습니다. 다음 예제는 로그 파일에서 발췌한 것으로, 자세한 내용은 가능한 가장 높은 값 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.

첫 번째 줄은 ifilttst.ini 파일에서 새 구성이 로드되었음을 나타내는 정보 메시지입니다. 줄(3)은 현재 구성을 읽은 ifilttst.ini 파일의 섹션 이름을 나타냅니다. 줄 (4)에서 (7) IFilter::Init에 대한 매개 변수를 나열합니다. 로 시작하는 INFO 줄은 IFilter 의 바인딩 및 유효성 검사 테스트 시작에 대한 정보 메시지입니다. 로 시작하는 PASS 줄은 통과한 특정 테스트와 관련된 메시지입니다.

다음 로그 예제의 줄은 경고입니다. 경고는 합법적이지만 문제가 있는 IFilter 동작에 주의를 기울입니다. 이 경고는 IFilter::GetChunk 메서드가 텍스트가 없는 텍스트 청크를 반환했음을 나타냅니다.

WARNING-First call to GetText() returned FILTER_E_NO_MORE_TEXT.

다음 예제 오류 메시지는 IFilter 가 요청되지 않은 청크를 내보낸 것을 나타냅니다.

            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

이 예제 오류 메시지의 경우 IFilter 는 PID 0x5가 인 청크를 내보냅니다. ifilttst.ini 섹션 [Test1] 을 검사하면 IFilter 가 이 PID로 청크를 내보내지 않도록 구성되었음을 보여 줍니다. 예를 들어 플래그 항목에 IFILTER_INIT_APPLY_INDEX_ATTRIBUTES 및 IFILTER_INIT_APPLY_OTHER_ATTRIBUTES 모두 지정되지 않았고 cAttributes 가 0이면 IFilter 는 PID 0x13 및 PID_STG_CONTENTS 해당하는 청크만 내보낸다.

샘플 덤프 파일

요청 시 Ifilttst.exe 프로그램은 찾은 청크 및 해당 콘텐츠를 포함하는 덤프를 생성할 수 있습니다. 다음 예제는 이러한 덤프 파일에서 발췌한 것입니다.

                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

처음 9개 줄은 현재 청크 구조를 설명합니다. GUID 및 PID는 PSGUID_STORAGE/PID_STG_CONTENTS 해당합니다. 일반 텍스트를 포함하는 청크입니다. 텍스트는 다음 청크 구조에 있습니다.

10. This is an HTML IFilter test page

줄 11부터 시작하는 다음 청크에는 에 해당하는 다른 GUID와 HTML HREF에 해당하는 HTML IFilter다른 PID가 있습니다. 이 속성은 에서 내보낸 내부 값 형식 속성입니다 HTML IFilter.

줄 21부터 시작하는 다음 청크는 GUID와 PID가 동일하지만 청크 상태는 대신 TEXT입니다VALUE. 마지막 두 청크의 텍스트는 첫 번째 청크의 텍스트와 동일합니다. 그러나 IFilter 는 이 구에 적용할 세 가지 특성(일반 텍스트, HTML HREF를 텍스트로, 값으로 HTML HREF)을 위해 설계되었기 때문에 결과는 세 개의 개별 청크로 내보내집니다.

추가 리소스

필터 처리기 개발

Windows Search의 필터 처리기 정보

Windows Search에서 필터 처리기를 만들기 위한 모범 사례

필터 처리기에서 속성 반환

Windows와 함께 제공되는 필터 처리기

Windows Search에서 필터 처리기 구현

필터 처리기 등록