다음을 통해 공유


WDS용 프로토콜 처리기 구현

참고

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

프로토콜 처리기를 만들려면 ISearchProtocol 을 구현하여 UrlAccessor 개체를 관리하고, IUrlAccessor 를 구현하여 메타데이터를 생성하고, 데이터 저장소의 항목에 대한 적절한 필터를 식별하고, IProtocolHandlerSite를 사용하여 SearchProtocol 개체를 인스턴스화하고 적절한 필터를 식별하고, IFilter를 사용하여 독점 파일을 필터링하거나 계층적으로 저장된 파일을 열거 및 필터링합니다. 프로토콜 처리기는 다중 스레드여야 합니다.

이 섹션에는 다음 topics 포함되어 있습니다.

URL에 대한 참고 사항

Microsoft WDS(Windows Desktop Search)는 URL을 사용하여 파일 시스템, 데이터베이스 같은 저장소 내부 또는 웹에서 항목을 고유하게 식별합니다. 진입 노드를 정의하는 URL을 시작 페이지라고 합니다. WDS는 해당 시작 페이지에서 시작하여 데이터 저장소를 재귀적으로 크롤링합니다. 일반적인 URL 구조는 다음과 같습니다.

protocol://host/path/name.extension

참고

새 데이터 저장소를 추가하려면 이름을 선택하여 현재 데이터 저장소와 충돌하지 않는 이름을 식별해야 합니다. companyName.scheme이라는 명명 규칙을 사용하는 것이 좋습니다.

 

프로토콜 처리기 인터페이스

ISearchProtocol

ISearchProtocol 인터페이스는 UrlAccessor 개체를 호출, 초기화 및 관리합니다. ISearchProtocol 인터페이스 구현에 대한 자세한 내용은 ISearchProtocol 인터페이스 참조를 참조하세요.

IUrlAccessor

지정된 URL의 경우 IUrlAccessor 인터페이스는 포함된 항목뿐만 아니라 위치 구조에 대한 메타데이터를 생성하고 해당 항목을 필터에 바인딩합니다. IUrlAccessor 개체는 SearchProtocol 개체에 의해 인스턴스화되고 초기화됩니다. 그러나 IUrlAccessor 개체가 액세스 중인 항목의 URL 유효성을 검사하거나 마지막으로 수정한 시간을 확인하여 현재 크롤링에서 파일을 처리해야 하는지 확인하는 등 프로토콜 처리기와 관련된 초기화 작업을 수행할 수 있도록 내부 초기화 메서드를 구현할 수도 있습니다.

참고

디렉터리에 대한 수정된 시간은 무시됩니다. IUrlAccessor 개체는 자식 개체를 열거하여 수정 또는 삭제가 있었는지 여부를 확인해야 합니다.

 

UrlAccessor 개체의 디자인 대부분은 구조체가 계층 구조인지 링크 기반인지에 따라 달라집니다. 계층적 데이터 저장소의 경우 UrlAccessor 개체는 콘텐츠를 열거할 수 있는 필터를 찾아야 합니다. 계층 구조와 링크 기반 프로토콜 처리기의 또 다른 차이점은 IsDirectory 메서드를 사용하는 것입니다. 링크 기반 프로토콜 처리기에서 이 메서드는 S_FALSE 반환해야 합니다. 계층적 프로토콜 처리기는 컨테이너에 대한 S_OK 반환해야 합니다.

IUrlAccessor 인터페이스 구현에 대한 자세한 지침은 IUrlAccessor 인터페이스 참조를 참조하세요.

IProtocolHandlerSite

이 인터페이스는 SearchProtocol 개체를 인스턴스화하는 데 사용되며 지정된 클래스 ID(CLSID)에 대한 적절한 필터를 UrlAccessor 개체에 제공합니다.

컨테이너용 IFilters

계층적 프로토콜 처리기를 구현하는 경우 컨테이너 또는 폴더를 나타내는 URL을 열거하는 컨테이너 IFilter구성 요소를 구현해야 합니다. 열거형 프로세스는 컨테이너의 각 항목을 나타내는 URL 목록을 반환하는 IFilter 인터페이스의 GetChunkGetValue 메서드를 통한 루프입니다.

먼저 GetChunk 는 속성이 GATHER_PROPSET 설정된 FULLPROSPEC를 반환합니다.

  • PID_GTHR_DIRLINK 마지막으로 수정한 시간 없이 항목에 대한 URL 또는
  • PID_GTHR_DIRLINK_WITH_TIME 마지막으로 수정한 시간과 함께 URL

GATHER_PROPSET 대한 속성 집합 GUID는 0B63E343-9CCC-11D0-BCDB-00805FCCCE04입니다. PROPSPEC 속성은 PID_GTHR_DIRLINK=2 또는 PID_GTHR_DIRLINK_WITH_TIME = 12진수입니다.

인덱서는 ISearchProtocol-CreateUrlAccessor() 및 IUrlAccessor-GetLastModified>>() 메서드를 호출하지 않고 항목을 인덱싱해야 하는지 여부를 즉시 확인할 수 있으므로 PID_GTHR_DIRLINK_WITH_TIME 반환하는 것이 더 효율적입니다.

그런 다음 GetValue 는 URL에 대한 PROPVARIANT를 반환하고 마지막으로 수정한 시간(사용된 경우)을 다음과 같이 반환합니다.

  • VT_LPWSTR, 자식 항목의 URL 또는
  • URL의 벡터 뒤에 FILETIME이 잇는 벡터

다음 샘플 코드는 적절한 PID_GTHR_DIRLINK_WITH_TIME 빌드하는 방법을 보여 줍니다.

참고

이 코드 및 정보는 특정 목적에 대한 상품성 및/또는 적합성에 대한 묵시적 보증을 포함하지만 이에 국한되지 않고 표현되거나 암시된 어떠한 종류의 보증도 없이 "있는 그대로" 제공됩니다.

Copyright (C) Microsoft. All rights reserved.

 

// params are assumed to be valid

HRESULT GetPropVariantForUrlAndTime(PCWSTR pszUrl, const FILETIME &ftLastModified, PROPVARIANT **ppPropValue)
{
    *ppPropValue = NULL;

    // allocate the propvariant pointer
    *ppPropValue = (PROPVARIANT *)CoTaskMemAlloc(sizeof(*ppPropValue));
    HRESULT hr = *ppPropValue ? S_OK : E_OUTOFMEMORY;

    if (SUCCEEDED(hr))
    {
        PropVariantInit(*ppPropValue);  // zero init the value

        // now allocate enough memory for 2 nested PropVariants.
        // PID_GTHR_DIRLINK_WITH_TIME is an array of 2 PROPVARIANTs
        PROPVARIANT *pVector = (PROPVARIANT *)CoTaskMemAlloc(sizeof(*pVector) * 2);
        hr = pVector ? S_OK : E_OUTOFMEMORY;

        if (SUCCEEDED(hr))
        {
            // set the container PROPVARIANT that it is a vector of 2 PROPVARIANTS
            (*ppPropValue)->vt = VT_VARIANT | VT_VECTOR;
            (*ppPropValue)->capropvar.cElems = 2;
            (*ppPropValue)->capropvar.pElems = pVector;
            PWSTR pszUrlAlloc;
            hr = SHStrDup(pszUrl, &pszUrlAlloc);

            if (SUCCEEDED(hr))
            {
                // now fill the array of PROPVARIANTS
                // put the pointer to the URL into the vector
                (*ppPropValue)->capropvar.pElems[0].vt = VT_LPWSTR; 
                (*ppPropValue)->capropvar.pElems[0].pwszVal = pszUrlAlloc;

                 // put the FILETIME into vector
                (*ppPropValue)->capropvar.pElems[1].vt = VT_FILETIME; 
                (*ppPropValue)->capropvar.pElems[1].filetime = ftLastModified;
            }

            else
            {
                CoTaskMemFree(pVector);
            }
        }
 
        if (FAILED(hr))
        {
            CoTaskMemFree(*ppPropValue);
            *ppPropValue = NULL;
        }
    }
    return S_OK;
}

참고

컨테이너 IFilter구성 요소는 인덱서가 열거 프로세스를 통해 삭제를 검색하므로 자식 URL이 변경되지 않은 경우에도 항상 모든 자식 URL을 열거해야 합니다. DIR_LINKS_WITH_TIME 날짜 출력이 데이터가 변경되지 않았다는 것을 나타내는 경우 인덱서는 해당 URL에 대한 데이터를 업데이트하지 않습니다.

 

실제 URL은 UrlAccessor 개체가 처리하는 URL입니다. 필터가 사용자에게 친숙한 DisplayUrl을 내보내지 않으면 WDS는 검색 결과의 일부로 사용자에게 실제 URL을 표시합니다. WDS 스키마에는 아래 표와 같이 최종 사용자에게 표시되는 내용을 제어하는 두 가지 속성이 포함되어 있습니다.

GUID PROPSPEC 설명
D5CDD505-2E9C-101B-9397-08002B2CF9AE DisplayFolder 검색 결과에서 사용자에게 표시되는 폴더 경로
D5CDD505-2E9C-101B-9397-08002B2CF9AE FolderName 부모 폴더의 표시 이름

 

코드에서 DisplayFolder 또는 FolderName을 내보내지 않는 경우 이러한 값은 DisplayUrl에서 계산됩니다. URL의 슬래시는 저장소 또는 파일 시스템 내의 컨테이너를 나타냅니다.

프로토콜 처리기 옵션 기능 추가

프로토콜 처리기에 기본 시작 페이지(및 항목 노드 URL)가 있도록 하려면 ISearchProtocolOptions 인터페이스를 구현해야 합니다. 이후 버전의 WDS에서 이 인터페이스는 향상된 사용자 환경을 위한 옵션 대화 상자에 후크를 제공합니다. 이 인터페이스는 다음과 같은 기능을 제공합니다.

  • 프로토콜 처리기에 대한 요구 사항이 충족되는지 여부를 결정합니다. 예를 들어 프로토콜 처리기의 저장소는 애플리케이션의 데이터를 제대로 인덱싱하기 위해 지정된 애플리케이션에 액세스해야 하지만 해당 애플리케이션을 사용할 수 없습니다.
  • 프로토콜 처리기가 항목을 처리하는 데 필요한 최소 요구 사항을 식별합니다. 요구 사항은 "Microsoft Outlook 2000 이상"과 같은 사용자에게 친숙한 지역화된 설명으로 표현할 수 있습니다.
  • 프로토콜 처리기가 기본적으로 처리해야 하는 URL을 정의합니다.

ISearchProtocolOptions

다음 표에서는 ISearchProtocolOptions 인터페이스에 대해 구현해야 하는 메서드에 대해 설명합니다.

메서드 Description
CheckRequirements 사용자 지정 프로토콜 처리기의 최소 요구 사항이 충족되는지 여부를 결정합니다.
GetDefaultCrawlScope 사용자 지정 프로토콜 처리기에 대해 지정된 저장소 내의 기본 URL 목록을 반환합니다.
GetRequirements 사용자 지정 프로토콜 처리기에 대한 최소 요구 사항에 대한 사용자에게 친숙한 지역화된 설명을 식별합니다.

 

참조

변경 내용 인덱스 알림

셸 확장을 사용하여 아이콘, 미리 보기 및 상황에 맞는 메뉴 추가

프로토콜 처리기 설치 및 등록