Windows Search에서 필터 처리기 구현

필터 처리기의 필요한 DLL 구조(IFilter 인터페이스의 구현)를 이해하는 것이 중요합니다.

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

DLL 진입점 구현 및 내보내기

각 IFilter DLL(이 섹션의 Ifilter.dll 표시)은 다음 진입점을 구현하고 내보내야 합니다. 이러한 진입점은 일반적으로 IFilter 인터페이스에 대한 모듈 정의(.def) 파일을 사용하거나 __declspec(dllexport) 키워드를 사용하여 내보냅니다. DLL 파일은 모든 폴더에 등록할 수 있지만 일반적으로 %SystemRoot%\system32 폴더에 상주합니다.

DLL 진입점은 다음 표에 나열되고 설명되어 있습니다.

DLL 이름 DLL 설명
DllRegisterServer DllRegisterServer 진입점은 DLL을 레지스트리의 필터로 등록합니다. IFilter 인터페이스 DLL 파일 이름을 인수로 사용하여 regsvr32.exe 프로그램을 실행하여 DLL을 등록합니다. regsvr32.exe %SystemRoot%\system32\Ifilter.dll
DllUnregisterServer 함수 DllUnregisterServer 함수 진입점은 레지스트리에서 영구 처리기로 DLL을 제거합니다. /u 플래그를 사용하여 regsvr32.exe 프로그램을 실행하여 DLL 등록을 취소합니다. regsvr32.exe /u %SystemRoot%\system32\Ifilter.dll
DllGetClassObject 함수 콘텐츠 인덱싱 클라이언트는 COM(Component Object Model)을 통해 DllGetClassObject 함수 진입점을 호출하여 IFilter 인터페이스에 대한 클래스 팩터리 개체를 만들고 해당 개체의 클래스 팩터리 인터페이스에 대한 포인터를 가져옵니다.
DllCanUnloadNow 함수 콘텐츠 인덱싱 클라이언트는 COM을 통해 DllCanUnloadNow 함수 진입점을 호출하여 IFilter DLL을 언로드할 수 있는지 여부를 확인합니다. IFilter 인터페이스는 FilterIdleTimeOut 레지스트리 값에 지정된 대로 시간 간격 동안 사용하지 않은 후 언로드됩니다.

IFilter 클래스 및 클래스 팩터리 구현

CFilter 및 CFilterCF와 같은 두 개 이상의 클래스는 일반적으로 각 IFilter DLL에 의해 구현됩니다. CFilter 클래스는 콘텐츠 필터링 기능을 구현하는 IFilter 인터페이스 개체를 생성합니다. 해당 멤버 함수는 IFilter 인터페이스의 인터페이스 메서드를 구현합니다. 각 IFilter 클래스에는 IFilter 인터페이스 구현자가 생성하는 CLSID(고유 클래스 식별자)가 필요합니다.

CFilterCF 클래스는 IFilter 인터페이스에 대한 클래스 팩터리 개체를 생성합니다. 클래스 팩터리는 IClassFactory 인터페이스 인터페이스를 통해 DLL의 DllGetClassObject 함수 진입점을 통해 호출됩니다. CFilterCF 클래스는 CFilter 개체를 만들고 IUnknown 대한 포인터를 반환합니다. 더 복잡한 경우 IFilter 단일 CFilter 클래스 대신 클래스 계층 구조를 구현할 수 있습니다.

COM 인터페이스 상속

Windows Search 3.0 이상에서는 다음과 같은 이유로 IPersistStream 사용해야 합니다.

  • 성능 및 향후 호환성을 보장합니다.
  • 보안을 강화하는 데 도움이 되도록 합니다. IFilter 인터페이스가 실행되는 컨텍스트에는 디스크 또는 네트워크를 통해 파일을 열 수 있는 권한이 필요하지 않으므로 IPersistStream 사용하여 구현된 IFilter가 더 안전합니다.
  • Windows Search는 IPersistStream만 사용하지만 IFilter 인터페이스 클래스는 이전 버전과의 호환성을 위해 IPersistFile 인터페이스 및/또는 IPersistStorage 인터페이스 인터페이스 구현을 상속할 수도 있습니다.

이러한 인터페이스는 mssdk\include 디렉터리에 포함된 파일에 선언되며 미리 정의된 IID(인터페이스 식별자)가 있습니다. 콘텐츠 인덱싱 클라이언트는 IUnknown 통해 IFilter 인터페이스를 쿼리하여 콘텐츠를 필터링할 때 사용할 인터페이스를 결정합니다.

COM 인터페이스 메서드 구현

IFilter 인터페이스는 IFilter 인터페이스 클래스와 IFilter 인터페이스 클래스 팩터리에 대한 IUnknown 메서드를 구현합니다. 다음 표에서는 vtable 순서로 IFilter 인터페이스별 인터페이스 및 IFilter 인터페이스가 구현해야 하는 메서드를 나열합니다. IFilter 인터페이스는 최소 IPersistStream구현해야 하지만 추가 IPersist 파생 인터페이스를 구현할 수 있습니다.

COM 인터페이스 메서드
IClassFactory 인터페이스 CreateInstance, LockServer
IClassFactory2 인터페이스 GetLicInfo, RequestLicKey, CreateInstanceLic
IFilter IFilter::Init, IFilter::GetChunk, IFilter::GetText, IFilter::GetValue, IFilter::BindRegion
IPersist 인터페이스 GetClassID
IPersistFile 인터페이스 IsDirty, Load, Save, SaveCompleted, GetCurFile
IPersistStorage 인터페이스 IsDirty, Load, Save, GetSizeMax
IPersistStream IsDirty, Load, Save, GetSizeMax

각 메서드에 대한 참조 페이지는 해당 메서드에 대한 매개 변수 및 기능 동작을 지정합니다. 각 참조 페이지는 해당 메서드에 대해 구현할 결과 코드도 제공합니다. IFilter 메서드에 대한 참조 페이지는 구현할 FACILITY_ITF 결과 코드의 인터페이스별 코드를 제공하며 콘텐츠 인덱싱 클라이언트는 FACILITY_NULL 및 FACILITY_WIN32 같은 제네릭 결과 코드를 처리할 수도 있습니다. 자세한 내용은 com 오류 코드 구조를 참조하세요.

구현되지 않은 COM 메서드

IFilter 인터페이스는 최소 IPersistStream구현해야 하지만 추가 IPersist 파생 인터페이스를 구현할 필요는 없습니다.

Windows Search는 다음 표에 나열된 COM 메서드를 구현할 필요가 없습니다.

필수가 아닌 메서드 묘사
IPersistStream::IsDirty 필터는 E_NOTIMPL 반환해야 합니다.
IPersistStream::Save 필터는 E_NOTIMPL 반환해야 합니다.
IPersistStream::GetSizeMax 필터는 E_NOTIMPL 반환해야 합니다.
IFilter::BindRegion 필터는 E_NOTIMPL 반환해야 합니다.

추가 리소스

필터 처리기 개발하기

Windows Search에서 필터 처리기 이해하기

Windows Search의 필터 처리기 생성 모범 사례

필터 처리기에서 속성 반환

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

필터 처리기 등록

테스트 필터 처리기