다음을 통해 공유


IFilter 추가 기능 개발

참고

Windows Desktop Search 2.x는 원래 Windows XP 및 Windows Server 2003용 추가 기능으로 사용할 수 있었던 사용되지 않는 기술입니다. 이후 릴리스에서는 Windows Search 를 대신 사용합니다.

IFilter인터페이스를 구현하는 구성 요소인 필터 추가 기능을 사용하여 Microsoft WDS(Windows Desktop Search)를 확장하여 새 파일 형식을 포함할 수 있습니다. 필터는 파일의 데이터에 액세스하고 구문 분석하고 인덱싱을 위한 텍스트 청크뿐만 아니라 속성 및 값 쌍을 반환하는 역할을 합니다. 인덱싱 프로세스 중에 WDS는 각 파일 또는 항목에 대한 URL을 사용하여 적절한 필터를 호출합니다. 필터는 먼저 WDS 스키마에서 검색 가능한 것으로 표시된 속성(예: 제목, 파일 크기 및 마지막으로 수정한 날짜)에 해당하는 메타데이터를 추출합니다. 그런 다음 항목 콘텐츠를 텍스트 청크로 나눕니다. WDS는 필터에서 반환된 속성과 텍스트를 카탈로그에 추가합니다. WDS는 등록된 필터가 있는 모든 파일 형식을 인덱싱할 수 있습니다.

경우에 따라 새 필터를 작성할 필요가 없습니다. WDS 2.x는 200개 이상의 항목(HTML, XML 및 소스 코드 파일과 같은 일반 텍스트 항목 포함)에 대한 필터를 포함하고 SharePoint Services 동일한 IFilter기술을 사용합니다. 파일 형식에 대한 필터가 이미 설치된 경우 WDS는 이러한 기존 필터를 사용하여 이 데이터를 인덱싱할 수 있습니다. 또한 WDS에는 일반 텍스트 기반 파일 형식에 대한 일반 필터가 포함되어 있습니다. 기존 SharePoint Services 필터 또는 일반 텍스트 필터에서 처리할 수 있는 파일 형식이 있는 경우 파일 이름 확장명 및 필터 GUID를 레지스트리에 추가하여 WDS에서 찾아서 사용할 수 있도록 할 수 있습니다(자세한 내용은 필터 추가 기능 등록 참조).

그러나 일반 텍스트가 아닌 전용 데이터 또는 파일 형식이 있는 경우 사용자 지정 필터 구현을 작성하는 것이 WDS가 카탈로그의 파일 형식을 인덱싱할 수 있도록 하는 유일한 방법입니다. 파일 형식에 대해 필터 추가 기능을 하나만 사용할 수 있으므로 기존 필터를 재정의하거나 다른 필터가 특정 파일 형식에 대해 사용자를 재정의하도록 할 수 있습니다.

이 섹션에서는 다음 항목을 다룹니다.

필수 필터 인터페이스

필터 추가 기능은 IFilter인터페이스와 다음 인터페이스 중 하나를 구현해야 합니다.

  • IPersistStream - 스트림에서 데이터를 로드합니다. 디스크에 아무것도 기록되지 않으므로 파일을 사용하는 것보다 더 안전합니다. IPersistStream 인터페이스는 Windows Vista와의 정방향 호환성을 위해 선호되는 방법입니다.
  • IPersistFile 인터페이스 - 파일에서 데이터를 로드합니다. 이 인터페이스는 Windows Vista에서 지원되지 않습니다.
  • IPersistStorage 인터페이스 - OLE COM 구조적 스토리지에서 데이터를 로드합니다.

필터 추가 기능은 이러한 인터페이스를 사용하여 항목의 내용을 가져오고 파일의 끝에 도달할 때까지 반복적으로 인덱스로 반환합니다. 필터 추가 기능은 손상된 파일과 예상 입력 형식을 충족하지 않는 파일을 처리할 수 있도록 최대한 강력해야 합니다.

IFilter 인터페이스

필터 구현에 필요한 인터페이스입니다. 자세한 내용은 IFilter인터페이스 참조를 참조하세요.

메서드 Description
Init() 필터링 세션을 초기화합니다.
GetChunk() 필터를 첫 번째 또는 다음 청크의 시작 부분에 배치하고 설명자를 반환합니다.
GetText() 현재 청크에서 텍스트를 검색합니다.
GetValue() 현재 청크에서 속성 값을 검색합니다.
BindRegion() 현재 내부용으로 예약되어 있습니다. 를 구현하지 않습니다. 이 메서드는 E_NOTIMPL 반환합니다.

 

IPersistStream

이 인터페이스는 IPersistFile 인터페이스 보다 더 안전한 처리를 위해 스트림에서 파일을 로드합니다. IPersistStream 필터가 실행되는 컨텍스트에는 디스크 또는 네트워크를 통해 파일을 열 수 있는 권한이 필요하지 않기 때문입니다. 단일 파일에 액세스하는 두 가지 방법 중에서 Windows와의 앞으로 호환성을 위해 선호하는 방법입니다.

메서드 Description
IsDirty() 변경 내용이 있는지 확인합니다. 이 메서드는 필터에서 E_NOTIMPL 반환합니다.
InitNew() 새 스토리지를 만듭니다. 이 메서드는 필터에서 E_NOTIMPL 반환합니다.
Load() 이전에 개체가 저장된 스트림에서 해당 개체를 초기화합니다.
Save() 개체를 지정된 스트림에 저장하고 개체가 더티 플래그를 다시 설정해야 하는지 여부를 나타냅니다. 이 메서드는 필터에서 E_NOTIMPL 반환합니다.
GetSizeMax() 개체를 저장하는 데 필요한 스트림의 크기를 바이트 단위로 반환합니다. 이 메서드는 필터에서 E_NOTIMPL 반환합니다.

 

IPersistFile

이 인터페이스는 절대 경로별로 파일을 로드하며 Windows Vista에서는 지원되지 않습니다.

메서드 Description
GetCurFile() 개체와 연결된 파일의 현재 이름을 가져옵니다. Load()에 지정된 경로를 반환합니다.
Load() 지정된 파일을 열고 파일 내용에서 개체를 초기화합니다. 필요할 때까지 파일 열기를 지연할 수 있습니다.
GetClassID() 새 파일 형식에 대한 CLSID(클래스 식별자)를 반환합니다. uuidgen.exe 사용하여 고유한 CLSID를 생성해야 합니다.
IsDirty() 필터에서 E_NOTIMPL 반환만 필요
Save() 필터에서 E_NOTIMPL 반환만 필요
SaveCompleted() 필터에서 E_NOTIMPL 반환만 필요

 

IPersistStorage

이 인터페이스는 포함된 각 개체에 컨테이너의 스토리지 내에 중첩된 자체 스토리지가 있는 구조화된 스토리지 모델을 지원합니다. IPersistFile 인터페이스와 마찬가지로 이 인터페이스는 절대 경로별로 로드되며 Windows Vista에서 지원되지 않습니다.

메서드 Description
IsDirty() 변경 내용이 있는지 확인합니다. 이 메서드는 필터에서 E_NOTIMPL 반환합니다.
InitNew() 새 스토리지를 만듭니다. 이 메서드는 필터에서 E_NOTIMPL 반환합니다.
Load() 스토리지를 저장합니다. 이 메서드는 필터에서 E_NOTIMPL 반환합니다.
Save() 개체를 저장하는 데 필요한 스트림의 크기를 바이트 단위로 반환합니다. 이 메서드는 필터에서 E_NOTIMPL 반환합니다.
SaveCompleted() 내부용으로 예약된 속성입니다. 이 메서드는 필터에서 E_NOTIMPL 반환합니다.
HandsOffStorage() 내부용으로 예약된 속성입니다. 이 메서드는 필터에서 E_NOTIMPL 반환합니다.

 

필터를 사용하여 속성 출력

필터의 목적은 전체 텍스트 인덱스 포함을 위해 파일의 콘텐츠 및 속성을 추출하는 것입니다. WDS는 먼저 IPersistFile, IPersistStream 또는 IPersistStorage 구현에서 Load 메서드를 호출한 다음 IFilter 구현의 Init 메서드를 호출합니다. GetChunk 는 텍스트 또는 속성 값 데이터의 청크를 검색하기 위해 호출되고 GetText 또는 GetValue 는 청크와 연결된 모든 텍스트 또는 속성 값을 검색하는 데 필요한 횟수만큼 호출됩니다. 이 프로세스는 GetChunk 가 문서에 더 이상 청크가 없다고 보고할 때까지 반복됩니다.

GetChunk 메서드는 필터링되는 파일에서 정보의 첫 번째 또는 다음 논리 블록에 대한 정보를 검색하고 단조롭게 증가하는 청크 ID를 포함하여 STAT_CHUNK 구조에서 해당 정보를 반환하고, 현재 청크가 이전 청크와 어떻게 관련되는지에 대한 정보, 청크에 텍스트 또는 값이 포함되어 있는지 여부를 나타내는 플래그를 상태. 청크의 로캘 및 청크의 속성 사양입니다. 속성 사양은 CLSID 및 정수 또는 문자열 속성 식별자(예: D5CDD505-2E9C-101B-9397-08002B2CF9AE/PerceivedType)로 구성된 FULLPROPSPEC 입니다. 속성 값 자체가 아닌 속성의 형식을 식별합니다.

청크 로캘 식별자는 적절한 단어 분리기를 선택하는 데 사용되며 올바르게 식별하는 것이 매우 중요합니다. 필터가 텍스트의 로캘을 확인할 수 없는 경우 GetSystemDefaultLCID를 사용하여 사용할 수 있는 기본 시스템 로캘을 가정해야 합니다. 파일 형식을 제어하고 현재 로캘 정보를 포함하지 않는 경우 적절한 로캘 식별을 사용하도록 설정하는 사용자 기능을 추가해야 합니다. 일치하지 않는 단어 분리기를 사용하면 사용자에게 잘못된 쿼리 환경이 발생할 수 있습니다.

GetChunk 는 청크 액세스만 관리하고 텍스트 또는 속성 값 자체를 반환하지 않습니다. 대신 GetTextGetValue 에 대한 후속 호출은 청크의 본문을 검색합니다. GetText 는 현재 CHUNK_TEXT 청크에서 유니코드 문자열인 텍스트 청크를 반환합니다. 현재 청크가 너무 크면 GetText 메서드를 두 개 이상 호출해야 할 수 있습니다. GetText 메서드에 대한 각 호출은 GetText 메서드에 대한 마지막 호출의 텍스트 바로 뒤에 있는 텍스트를 검색합니다. 예를 들어 한 호출의 마지막 문자는 단어 중간에 있을 수 있으며 다음 호출의 첫 번째 문자는 해당 단어를 계속합니다. 검색 엔진은 이 상황을 처리해야 합니다.

GetValue 는 PROPVARIANT 구조에서 현재 CHUNK_VALUE 청크에 대한 속성 값을 반환하며, 다양한 데이터 형식을 보유할 수 있습니다. GetValue 는 CoTaskMemAlloc을 사용하여 PROPVARIANT 구조 자체를 할당해야 합니다. GetValue 호출자는 PropVariantClear를 사용하여 PROPVARIANT가 가리키는 메모리를 해제하고 CoTaskMemFree를 사용하여 구조 자체를 해제하는 작업을 담당합니다. PROPVARIANT에 대한 자세한 내용은 PROPVARIANT 참조를 참조하세요.

속성 값

필터는 WDS 결과 보기의 기본 열인 다음 속성을 최소한 출력해야 합니다.

GUID PROPSPEC 친숙한 이름 설명
F29F85E0-4FF9-1068-AB91-08002B27B3D9 2 PrimaryTitle 이 항목에 대해 표시되는 제목입니다.
F29F85E0-4FF9-1068-AB91-08002B27B3D9 4 PrimaryAuthors 이 항목과 가장 연결된 사람입니다.
D5CDD505-2E9C-101B-9397-08002B2CF9AE PrimaryDate PrimaryDate 항목에 대한 가장 중요한 날짜(예: 전자 메일에 수신되거나 파일에 대해 수정된 날짜)입니다.
D5CDD505-2E9C-101B-9397-08002B2CF9AE PerceivedType PerceivedType 구문 분석할 파일의 형식입니다. WDS 인식 형식에 나열된 Windows 데스크톱 검색 유형 중 하나와 일치해야 합니다.

 

일반 텍스트 항목의 경우 WDS는 인덱스에 새 일반 텍스트 파일 형식을 포함하는 에 파일 크기 또는 확장명과 같은 모든 텍스트 및 시스템 정의 속성을 추출합니다. 인덱스로 반환할 수 있는 다른 유형의 속성은 다음과 같습니다.

  • 파일의 경우: 작성자, 제목, 상태, 키워드
  • 미디어: 앨범, 장르, 카메라 메이크, 촬영 날짜
  • 통신의 경우: 에서, 받는 사람, 참조, 중요도
  • 연락처: 직함, 회사 전화, 회사

위의 목록은 지정된 인식된 형식에 공통적인 속성을 그룹화합니다. 그러나 형식에 관계없이 모든 속성을 사용할 수 있습니다. 예를 들어 연락처의 고용주 이름에 회사를 사용할 수 있으며 파일과 관련된 클라이언트 이름을 참조하는 데 사용할 수도 있습니다. 이러한 속성 중 대부분은 WDS 결과 보기에 검색 결과를 표시하는 데 사용됩니다. 예를 들어 파일의 Title 속성은 기본 결과 보기에서 기본 열로 표시됩니다. IFilter 개체는 구문 분석 중인 항목 유형과 관련된 모든 속성을 출력해야 합니다. WDS 2.x에서는 사용자 지정 속성을 추가할 수 없습니다. 사용 가능한 속성의 전체 목록은 WDS 스키마를 참조하세요.

필터 추가 기능 설치

필터를 설치하려면 DLL을 Program Files 디렉터리의 적절한 위치에 복사하고 등록해야 합니다. 필터는 설치를 위해 자체 등록을 구현해야 하며 다음 지침을 따라야 합니다.

  • 설치 관리자는 EXE 또는 MSI 설치 관리자를 사용해야 합니다.
  • 릴리스 정보를 제공해야 합니다.
  • 설치된 각 추가 기능에 대해 프로그램 추가/제거 항목을 만들어야 합니다.
  • 설치 관리자는 현재 추가 기능이 이해하는 특정 파일 형식 또는 저장소에 대한 모든 레지스트리 설정을 인수해야 합니다.
  • 이전 추가 기능을 덮어쓰는 경우 설치 관리자가 사용자에게 알려야 합니다.
  • 최신 추가 기능이 이전 추가 기능을 덮어쓴 경우 이전 추가 기능의 기능을 복원하고 해당 파일 형식 또는 저장소에 대한 기본 추가 기능으로 만드는 기능이 있어야 합니다.

등록에 필요한 CLSID

모든 필터와 연결된 세 개의 클래스 식별자 또는 CLSID가 있습니다. 필터 추가 기능을 등록하려면 이 중 하나 이상(uuidgen.exe 사용)을 생성해야 합니다.

  • 첫 번째는 {89BCB740-6119-101A-BCB7-00DD010655AF}인 모든 필터의 영구 처리기 IID_IFilter 식별합니다. 이 CLSID는 IFilter를 구현하는 모든 필터에 대해 상수입니다.
  • 두 번째(IID_IFilter 키 값)는 파일 형식에 대한 IFilter 구현을 식별합니다. 이 키에는 경로 및 스레딩 모델별로 DLL 이름을 지정하는 InprocServer32 값이 포함되어 있습니다. 필터가 system32 디렉터리처럼 시스템 경로에 있는 경우 파일 이름으로 충분합니다. 그렇지 않으면 이 값에 전체 경로 사양이 있어야 합니다.
  • 세 번째는 필터 프로세스의 파일 형식을 식별하고 IPersist 인터페이스의 GetClassID 메서드에 의해 반환됩니다.

참고

이후 버전의 Microsoft 운영 체제에서는 system32 디렉터리에 파일을 설치하는 것이 더 어려울 수 있으므로 프로그램 파일 아래에 파일을 설치하고 레지스트리에 필터의 전체 경로를 포함하는 것이 좋습니다. 보안상의 이유로 레지스트리에서 DLL의 전체 경로를 지정하는 것도 좋습니다. 그렇지 않으면 버전 이전의 프로세스 경로에 있는 경우 DLL의 "트로이 목마" 버전이 로드될 수 있습니다.

 

등록 모델

WDS에서 파일을 필터링할 준비가 되면 파일 확장명 아래의 레지스트리를 확인하여 로드할 필터를 확인합니다. 그런 다음, 일련의 레지스트리 링크를 따라 필터 DLL의 이름을 다음 순서대로 찾습니다.

  1. 에 있는 CLSID에서:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

  2. 파일 콘텐츠 형식에서 다음을 수행합니다.

    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Content Type

  3. 파일 이름 확장명(Win32 LoadIFilter API와 동일)에서 다음을 수행합니다.

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

    HKEY_CLASSES_ROOT\extpersistentHandler-CLSID-IID_IFilter-CLSID>>>

  4. 기본값:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

필터 추가 기능을 등록하려면

필터 추가 기능을 등록하려면 레지스트리에서 총 8개의 항목을 만들어야 합니다. 여기서는 다음과 같습니다.

  • .ext 는 새 파일 이름 확장명입니다.
  • GUID_1 이 확장에 대해 생성된 모든 새 GUID일 수 있습니다.
  • 89BCB740-6119-101A-BCB7-00DD010655AF 는 모든 IFilter 구현에 대한 상수인 IFilter 인터페이스 GUID입니다.
  1. 파일 이름 확장 프로그램에 대한 영구 처리기를 다음 키와 값으로 등록합니다.

    HKEY_CLASSES_ROOT\<.ext>\PersistentHandler
       (Default) = {GUID_1}
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}
       (Default) = <Persistent Handler Description>
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered
       (Default) = (Value Not Set)
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered\{89BCB740-6119-101A-BCB7-00DD010655AF}
       (Default) = {CLSID of IFilter implementation}
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentHandler
       (Default) = {GUID_1}
    
  2. 다음 키와 값으로 IFilter 구현을 등록합니다.

    HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}
       (Default) = Extension IFilter Description">
    
    HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}\InprocServer32
       (Default) = <DLL Install Path>
       ThreadingModel = Both
    
  3. 다음 키와 값을 사용하여 IFilter 구현을 Windows Desktop Search에 등록합니다.

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Extension\<.ext>
       (Default) = {CLSID of IFilter implementation}"
    

참조

SchemaTable

인식된 형식

프로토콜 처리기 개발

기타 리소스

IFilter