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 을 사용해야 합니다.
- 성능 및 향후 호환성을 보장합니다.
- 보안을 강화합니다. IPersistStream으로 구현된 IFilter는 IFilter 인터페이스가 실행되는 컨텍스트에서 디스크 또는 네트워크를 통해 파일을 열 수 있는 권한이 필요하지 않으므로 더 안전합니다.
- Windows Search는 IPersistStream만 사용하지만 IFilter 인터페이스 클래스는 이전 버전과의 호환성을 위해 IPersistFile 인터페이스 및/또는 IPersistStorage 인터페이스 구현을 상속할 수도 있습니다.
이러한 인터페이스는 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 반환해야 합니다. |
추가 리소스
- GitHub에서 사용할 수 있는 IFilterSample 코드 샘플에서는 IFilter 인터페이스를 구현하기 위한 IFilter 기본 클래스를 만드는 방법을 보여 줍니다.
- 인덱싱 프로세스에 대한 개요 는 인덱싱 프로세스를 참조하세요.
- 파일 형식에 대한 개요는 파일 형식을 참조하세요.
- 파일 형식에 대한 파일 연결 특성을 쿼리하려면 PerceivedTypes, SystemFileAssociations 및 애플리케이션 등록을 참조하세요.