IFilter 인터페이스의 구현인 필터 처리기는 문서에서 텍스트 및 속성을 검색합니다. 필터 처리기는 이러한 항목에서 텍스트 청크를 추출하여 포함된 서식을 필터링하고 텍스트 위치에 대한 정보를 유지합니다. 또한 문서 속성인 값 청크를 추출합니다. IFilter 문서 인덱서 및 애플리케이션 독립적 뷰어와 같은 상위 수준 애플리케이션을 빌드하기 위한 기반입니다.
이 항목은 다음과 같이 구성됩니다.
-
IFilter 인터페이스에 대한 정보
- 격리 프로세스
- IFilter DLL
- IFilter 구조체
- 네이티브 코드
- IFilter 클래스 식별자 찾기
- 추가 리소스
- 관련 항목
IFilter 인터페이스 정보
Microsoft Windows Search는 필터를 사용하여 전체 텍스트 인덱스에 포함할 항목의 콘텐츠를 추출합니다. 콘텐츠를 추출하는 필터를 작성하여 새 파일 또는 독점 파일 형식을 인덱싱하도록 Windows Search를 확장하고 속성 처리기를 사용하여 파일의 속성을 추출할 수 있습니다.
IFilter 인터페이스는 전체 텍스트 검색 엔진의 특정 요구 사항을 충족하도록 설계되었습니다. Windows Search와 같은 전체 텍스트 검색 엔진은 IFilter 메서드를 호출하여 텍스트 및 속성 정보를 추출하고 인덱스에 추가합니다. Windows Search는 반환된 IFilter::GetText 메서드의 결과를 단어로 구분하고, 정규화하고, 인덱스에 저장합니다. 사용 가능한 경우 검색 엔진은 텍스트 청크의 LCID(언어 코드 식별자)를 사용하여 언어별 단어 분리 및 정규화를 수행합니다.
Windows Search는 다음 표에 설명된 세 가지 함수를 사용하여 등록된 필터 처리기(IFilter 인터페이스 구현)에 액세스합니다. 이러한 함수는 포함된 개체의 필터 처리기를 로드하고 바인딩할 때 특히 유용합니다.
| 기능 | 묘사 |
|---|---|
| LoadIFilter | 지정된 콘텐츠 형식에 가장 적합한 IFilter 대한 포인터를 가져옵니다. |
| BindIFilterFromStorage (스토리지에서 IFilter 바인딩) | IStorage Interface 개체에 포함된 콘텐츠에 가장 적합한 IFilter 대한 포인터를 가져옵니다. |
| BindIFilterFromStream | 스트림 변수에서 검색된 CLSID(지정된 클래스 식별자)에 가장 적합한 IFilter 대한 포인터를 가져옵니다. |
IFilter 인터페이스에는 다음 표에 설명된 5개의 메서드가 있습니다.
| 메서드 | 묘사 |
|---|---|
| IFilter::Init | 필터링 세션을 초기화합니다. |
| IFilter::GetChunk | 첫 번째 또는 다음 청크의 시작 부분에 IFilter를 위치시키고 설명자를 반환합니다. |
| IFilter::GetText | 현재 청크에서 텍스트를 검색합니다. |
| IFilter::GetValue | 현재 청크에서 값을 검색합니다. |
| IFilter::BindRegion | 개체의 지정된 부분을 나타내는 인터페이스를 검색합니다. 나중에 사용할 수 있습니다. |
격리 프로세스
Windows Search는 제한된 권한으로 로컬 시스템 보안 컨텍스트에서 IFilter를 실행합니다. 이 IFilter 호스트 격리 프로세스에서는 다음과 같은 여러 권한이 제거됩니다.
- 제한된 코드
- 모두
- 현지
- 대화형
- 인증된 사용자
- 기본 제공 사용자
- 사용자의 SID(보안 식별자)
이러한 권한을 제거하면 IFilter 인터페이스가 디스크 시스템 또는 네트워크 또는 사용자 인터페이스 또는 클립보드 함수에 액세스할 수 없습니다. 또한 격리 프로세스는 자식 프로세스가 만들어지는 것을 방지하고 작업 집합에 100MB 제한을 적용하는 작업 개체에서 실행됩니다. IFilter 인터페이스 호스트 격리 프로세스는 타사 필터가 잘못 구현될 수 있으므로 인덱싱 플랫폼의 안정성을 높입니다.
메모
버퍼를 관리하고 올바르게 스택하려면 필터 처리기를 작성해야 합니다. 모든 문자열 복사본에는 버퍼 오버런을 방지하려면 명시적 검사가 있어야 합니다. 항상 버퍼의 할당된 크기를 확인해야 합니다. 항상 버퍼 크기에 대해 데이터 크기를 테스트해야 합니다.
IFilter dlls
IFilter DLL은 IFilter 인터페이스를 구현하여 클라이언트가 파일 형식, 클래스 또는 인식된 형식에서 텍스트 및 속성 값 정보를 추출할 수 있도록 합니다. Windows Search 필터링 프로세스는 항목의 클래스, 인식된 형식 또는 이름 확장에 대해 등록된 IFilter에 SearchFilterHost.exe 바인딩합니다.
IFilter 구조체
각 IFilter 지정된 필터링 기능을 제공하는 COM(In-process Component Object Model) 서버를 구현하는 DLL 파일입니다. 다음 그림에서는 일반적인 IFilter DLL의 전체 구조를 보여 줍니다. 더 복잡한 예제는 둘 이상의 IFilter 클래스를 구현할 수 있습니다.
일반적인 ifilter dll
diagram of the structure of a typical ifilter dll구조의다이어그램
네이티브 코드
여러 추가 기능이 실행되는 프로세스의 잠재적인 CLR(공용 언어 런타임) 버전 관리 문제로 인해 필터를 네이티브 코드로 작성해야 합니다. Windows 7 이상에서는 관리 코드로 작성된 필터가 명시적으로 차단됩니다.
IFilter 클래스 식별자 찾기
IFilter DLL의 클래스는 PersistentHandler 레지스트리 키 아래에 등록됩니다. HTML 파일의 경우 다음 예제에서는 HTML 문서에 대한 IFilter DLL을 찾는 방법을 보여 줍니다. 이 예제에서는 시스템에서 항목과 연결된 IFilter 찾는 데 사용하는 것과 유사한 논리를 따릅니다.
- DLL 필터의 파일 형식에 대한 확장 프로그램에 레지스트리 항목 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes아래에 등록된 PersistentHandler가 있는지 확인합니다. 이 키를
Value1로 하십시오. 해당 항목이 이미 있는 경우 이 절차의 4단계로 건너뛰고 해당 키에Value1사용합니다. 값은 REG_SZ 형식입니다.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- 또는 확장에 대해 등록된 PersistentHandler가 없는 경우 레지스트리 항목 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes아래에 있는 문서 형식과 연결된 CLSID를 찾습니다. 이 키를
Value2로 하십시오.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
CLSID
{25336920-03F9-11CF-8FD0-00AA00686F13}
- PersistentHandler가 CLSID에 등록되어 있는지 여부를 확인합니다. 2단계에서 결정된
Value2를 사용하여 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2 항목의 PersistentHandler를 찾습니다. 이 키를Value3로 하십시오.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
-
IFilter 영구 처리기 GUID를 확인합니다.
Value1및Value3사용하여 문서 형식에 대한 IFilter 영구 처리기 GUID를 찾습니다. 레지스트리 항목 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 또는 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/>이 이 문서 형식에 대한 IFilter PersistentHandler GUID의 결과를 생성합니다. 이 키를Value4로 하십시오. 이 예제에서 IFilter 인터페이스 GUID는 89BCB740-6119-101A-BCB7-00DD010655AF입니다.
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
{EEC97550-47A9-11CF-B952-00AA0051FE20}
= HTML File Persistent Handler
Data type REG_SZ
PersistentAddinsRegistered
{89BCB740-6119-101A-BCB7-00DD010655AF}
Data type REG_SZ
default = {E0CA5340-4534-11CF-B952-00AA0051FE20}
메모
이 예제에서는 HTML 문서에 대한 IFilter DLL이 nlhtml.dll.
IFilter::GetChunk 및 로캘 코드 식별자
텍스트의 LCID는 단일 파일 내에서 변경할 수 있습니다. 예를 들어 설명서의 텍스트는 영어(en-us)와 스페인어(es) 간에 번갈아 가거나 텍스트에 기본 언어가 아닌 다른 언어로 한 단어를 포함할 수 있습니다. 두 경우 모두 LCID가 변경될 때마다 IFilter는 새 청크를 시작해야 합니다. LCID는 적절한 단어 분리기를 선택하는 데 사용되므로 이를 올바르게 식별하는 것이 매우 중요합니다. IFilter 텍스트의 로캘을 확인할 수 없는 경우, 청크와 함께 LCID가 0인 값을 반환해야 합니다. LCID가 0이면 Windows Search에서 LAD(언어 자동 검색) 기술을 사용하여 청크의 로캘 ID를 결정합니다. Windows Search에서 일치 항목을 찾을 수 없는 경우 기본값은 시스템 기본 로캘입니다(GetSystemDefaultLocaleName 함수 함수를 호출하여). 자세한 내용은 IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATE및 STAT_CHUNK참조하세요.
파일 형식을 제어하고 현재 로캘 정보를 포함하지 않는 경우 사용자 기능을 추가하여 적절한 로캘 식별을 사용하도록 설정해야 합니다. 일치하지 않는 단어 분리기를 사용하면 사용자에게 쿼리 환경이 저하될 수 있습니다. 자세한 내용은 IWordBreaker참조하세요.
메모
필터는 파일 이름 확장명, MIME 형식 또는 CLSID로 표시된 대로 파일 형식과 연결됩니다. 하나의 필터가 여러 파일 형식을 처리할 수 있지만 각 형식은 하나의 필터로만 작동합니다.
추가 리소스
- GitHub사용할 수 있는 IFilterSample 코드 샘플은 IFilter 인터페이스를 구현하기 위한 IFilter 기본 클래스를 만드는 방법을 보여 줍니다.
- 인덱싱 프로세스에 대한 개요는 인덱싱 프로세스 참조하세요.
- 파일 형식에 대한 개요는 파일 형식참조하세요.
- 파일 형식에 대한 파일 연결 특성을 쿼리하려면 PerceivedTypes, SystemFileAssociations 및 애플리케이션 등록참조하세요.
관련 항목
필터 처리기 개발
Windows Search에서 필터 처리기를 만들기 위한 모범 사례
Windows와 함께 제공되는 필터 처리기