Windows Search에서 필터 처리기 구현

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

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

DLL 진입점 구현 및 내보내기

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

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

DLL 이름 DLL 설명
DllRegisterServer DllRegisterServer 진입점은 DLL을 레지스트리의 필터로 등록합니다. IFilter 인터페이스 DLL 파일 이름을 인수로 사용하여 regsvr32.exe 프로그램을 실행하여 DLL을 등록합니다.regsvr32.exe %SystemRoot%\system32\Ifilter.dll
DllUnregisterServer 함수 DllUnregisterServer 함수 진입점은 레지스트리에서 영구 처리기로 DLL을 제거합니다. 플래그를 사용하여 regsvr32.exe 프로그램을 실행하여 DLL을 등록 취소합니다 /u . regsvr32.exe /u %SystemRoot%\system32\Ifilter.dll
DllGetClassObject 함수 콘텐츠 인덱싱 클라이언트는 COM(구성 요소 개체 모델)을 통해 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 을 사용해야 합니다.

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

COM 인터페이스 메서드 구현

IFilter 인터페이스는 IFilter 인터페이스 클래스와 IFilter 인터페이스 클래스 팩터리 모두에 대해 IUnknown 메서드를 구현합니다. 다음 표에는 IFilter 인터페이스에서 구현해야 하는 IFilter 인터페이스별 인터페이스 및 메서드가 vtable 순서로 나열되어 있습니다. 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와 함께 제공되는 필터 처리기

필터 처리기 등록

필터 처리기 테스트