프로토콜 처리기 설치 및 등록(Windows Search)

프로토콜 처리기를 설치하려면 DLL을 Program Files 디렉터리의 적절한 위치에 복사한 다음 레지스트리를 통해 프로토콜 처리기를 등록해야 합니다. 설치 애플리케이션은 검색 루트 및 범위 규칙을 추가하여 셸 데이터 원본에 대한 기본 크롤링 범위를 정의할 수도 있습니다.

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

URL 정보

Windows Search는 URL을 사용하여 셸 데이터 원본의 계층 구조에서 항목을 고유하게 식별합니다. 계층 구조의 첫 번째 노드인 URL을 검색 루트라고 합니다. Windows Search는 검색 루트에서 인덱싱을 시작하여 프로토콜 처리기가 각 URL에 대한 자식 링크를 열거할 것을 요청합니다.

일반적인 URL 구조는 다음과 같습니다.

<protocol>:// [{user SID}/] <localhost>/<path>/[<ItemID>]

URL 구문은 다음 표에 설명되어 있습니다.

구문 설명
<protocol> URL에 대해 호출할 프로토콜 처리기를 식별합니다.
{user SID} 프로토콜 처리기가 호출되는 사용자 보안 컨텍스트를 식별합니다. SID(사용자 보안 식별자)가 식별되지 않으면 프로토콜 처리기가 시스템 서비스의 보안 컨텍스트에서 호출됩니다.
<path> 각 슬래시('/')가 폴더 이름 사이의 구분 기호인 저장소의 계층 구조를 정의합니다.
<Itemid> 자식 항목(예: 파일 이름)을 식별하는 고유 문자열을 나타냅니다.

 

Windows Search 인덱서는 URL에서 마지막 슬래시를 트리밍합니다. 따라서 최종 슬래시의 존재 여부에 의존하여 디렉터리 및 항목을 식별할 수 없습니다. 프로토콜 처리기는 이 URL 구문을 처리할 수 있어야 합니다. 셸 데이터 원본을 식별하기 위해 선택한 프로토콜 이름이 현재 데이터 원본과 충돌하지 않는지 확인합니다. 다음 명명 규칙을 companyName.scheme사용하는 것이 좋습니다.

셸 데이터 원본을 만드는 방법에 대한 자세한 내용은 기본 폴더 개체 인터페이스 구현을 참조 하세요.

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

프로토콜 처리기를 만들려면 다음 세 가지 인터페이스를 구현해야 합니다.

나열된 세 가지 필수 인터페이스 외에 다른 인터페이스는 선택 사항이며 현재 작업에 가장 적합한 선택적 인터페이스를 구현할 수 있습니다.

ISearchProtocol 및 ISearchProtocol2

SearchProtocol 인터페이스는 프로토콜 처리기 UrlAccessor 개체를 초기화하고 관리합니다. ISearchProtocol2 인터페이스는 ISearchProtocol선택적 확장이며 사용자 및 항목에 대한 자세한 정보를 지정하는 추가 메서드를 포함합니다.

IUrlAccessor, IUrlAccessor2, IUrlAccessor3 및 IUrlAccessor4

IUrlAccessor 인터페이스는 다음 표에 설명되어 있습니다.

인터페이스 설명
IUrlAccessor 지정된 URL의 경우 IUrlAccessor 인터페이스는 URL에 노출되는 항목의 속성에 대한 액세스를 제공합니다. 또한 이러한 속성을 프로토콜 처리기별 필터(즉, 파일 이름과 연결된 필터 이외의 필터)에 바인딩할 수 있습니다.
IUrlAccessor2 (선택 사항) IUrlAccessor2 인터페이스는 항목의 속성 및 표시 URL에 대한 코드 페이지를 가져오는 메서드와 URL(문서 또는 디렉터리)의 항목 형식을 가져오는 메서드를 사용하여 IUrlAccessor를 확장합니다.
IUrlAccessor3 (선택 사항) IUrlAccessor3 인터페이스는 사용자 SID 배열을 가져오는 메서드를 사용하여 IUrlAccessor2를 확장하므로 검색 프로토콜 호스트가 이러한 사용자를 가장하여 항목을 인덱싱할 수 있습니다.
IUrlAccessor4 (선택 사항) IUrlAccessor4 인터페이스는 항목의 콘텐츠를 인덱싱해야 하는지 여부를 식별하는 메서드를 사용하여 IUrlAccessor3 인터페이스의 기능을 확장합니다.

 

UrlAccessor 개체는 SearchProtocol 개체에 의해 인스턴스화되고 초기화됩니다. IUrlAccessor 인터페이스는 다음 표에 설명된 메서드를 통해 중요한 정보에 대한 액세스를 제공합니다.

메서드 설명
IUrlAccessor::GetLastModified URL이 마지막으로 수정된 시간을 반환합니다. 이 시간이 인덱서가 이 URL을 마지막으로 처리한 시간보다 더 최근인 경우 필터 처리기(IFilter 인터페이스의 구현)를 호출하여 해당 항목에 대해 변경된 데이터를 추출합니다. 디렉터리에 대한 수정된 시간은 무시됩니다.
IUrlAccessor::IsDirectory URL이 자식 URL을 포함하는 폴더를 나타내는지 여부를 식별합니다.
IUrlAccessor::BindToStream 사용자 지정 데이터 저장소에 있는 파일의 데이터를 나타내는 IStream 인터페이스 에 바인딩합니다.
IUrlAccessor::BindToFilter 항목에 대한 속성을 노출할 수 있는 프로토콜 처리기별 IFilter에 바인딩합니다.
IUrlAccessor4::ShouldIndexItemContent 항목의 콘텐츠를 인덱싱해야 하는지 여부를 식별합니다.

 

IProtocolHandlerSite

IProtocolHandlerSite 인터페이스는 격리된 프로세스에서 호스트되는 필터 처리기를 인스턴스화하는 데 사용됩니다. 지정된 CLSID(영구 클래스 식별자), 문서 스토리지 클래스 또는 파일 이름 확장명에서 적절한 필터 처리기를 가져옵니다. 호스트 프로세스에 IFilter에 바인딩하도록 요청하는 이점은 호스트 프로세스가 적절한 필터 처리기를 찾는 프로세스를 관리하고 처리기 호출과 관련된 보안을 제어할 수 있다는 것입니다.

컨테이너에 대한 필터 처리기 구현

계층 프로토콜 처리기를 구현하는 경우 자식 URL을 열거하는 컨테이너에 대한 필터 처리기를 구현해야 합니다. 필터 처리기는 IFilter 인터페이스의 구현입니다. 열거형 프로세스는 IFilter 인터페이스의 IFilter::GetChunk IFilter::GetValue 메서드를 통한 루프입니다. 각 자식 URL은 속성 값으로 노출됩니다.

IFilter::GetChunk 는 컨테이너의 속성을 반환합니다. 자식 URL 을 열거하기 위해 IFilter::GetChunk 는 다음 중 하나를 반환합니다.

  • PKEY_Search_UrlToIndex:

    마지막으로 수정한 시간이 없는 항목의 URL입니다. IFilter::GetValue 는 자식 URL을 포함하는 PROPVARIANT를 반환합니다.

  • PKEY_Search_UrlToIndexWithModificationTime:

    URL 및 마지막으로 수정한 시간입니다. IFilter::GetValue 는 자식 URL의 벡터와 마지막으로 수정된 시간을 포함하는 PROPVARIANT를 반환합니다.

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

다음 예제 코드에서는 PKEY_Search_UrlToIndexWithModificationTime 속성을 반환하는 방법을 보여 줍니다.

Important

Copyright (c) Microsoft Corporation. All rights reserved.

 

// Parameters are assumed to be valid

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

    // Allocate the propvariant pointer.
    size_t const cbAlloc = sizeof(**ppPropValue);
    *ppPropValue = (PROPVARIANT *)CoTaskMemAlloc(cbAlloc));

    HRESULT hr = *ppPropValue ? S_OK : E_OUTOFMEMORY;

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

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

        if (SUCCEEDED(hr))
        {
            // Set the container PROPVARIANT to be a vector of two 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을 열거해야 합니다. PKEY_Search_UrlToIndexWithModificationTime 날짜 출력이 데이터가 변경되지 않았다는 것을 나타내는 경우 인덱서는 해당 URL에 대한 데이터를 업데이트하지 않습니다.

 

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

프로토콜 처리기를 설치하려면 DLL을 Program Files 디렉터리의 적절한 위치에 복사한 다음 DLL을 등록해야 합니다. 프로토콜 처리기는 설치를 위해 자체 등록을 구현해야 합니다. 또한 설치 애플리케이션은 검색 루트 및 범위 규칙을 추가하여 셸 데이터 원본에 대한 기본 크롤링 범위를 정의할 수 있습니다. 이 항목은 이 항목의 끝에 인덱싱되는지 확인에서 설명합니다.

프로토콜 처리기 등록 지침

프로토콜 처리기를 등록할 때 다음 지침을 따라야 합니다.

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

프로토콜 처리기 등록

프로토콜 처리기 구성 요소를 등록하려면 레지스트리에 14개의 항목을 만들어야 합니다. 여기서는 다음과 같습니다.

  • Ver_Ind_ProgID 프로토콜 처리기 구현의 버전 독립적 ProgID입니다.
  • Ver_Dep_ProgID 프로토콜 처리기 구현의 버전 종속 ProgID입니다.
  • CLSID_1 프로토콜 처리기 구현의 CLSID입니다.

프로토콜 처리기를 등록하려면 다음을 수행합니다.

  1. 다음 키 및 값으로 버전 독립적 ProgID를 등록합니다.

    HKEY_CLASSES_ROOT
       <Ver_Ind_ProgID>
          (Default) = <Protocol Handler Class Description>
    
    HKEY_CLASSES_ROOT
       <Ver_Ind_ProgID>
          CLSID
             (Default) = {CLSID_1}
    
    HKEY_CLASSES_ROOT
       <Ver_Ind_ProgID>
          CurVer
             (Default) = <Ver_Dep_ProgID>
    
  2. 버전 종속 ProgID를 다음 키 및 값으로 등록합니다.

    HKEY_CLASSES_ROOT
       <Ver_Dep_ProgID>
          (Default) = <Protocol Handler Class Description>
    
    HKEY_CLASSES_ROOT
       <Ver_Dep_ProgID>
          CLSID
             (Default) = {CLSID_1}
    
  3. 다음 키와 값으로 프로토콜 처리기의 CLSID를 등록합니다.

    HKEY_CLASSES_ROOT
       {CLSID_1}
          (Default) = <Protocol Handler Class Description>
    
    HKEY_CLASSES_ROOT
       {CLSID_1}
          {InprocServer32}
             (Default) = <DLL Install Path>
             Threading Model = Both
    
    HKEY_CLASSES_ROOT
       {CLSID_1}
          <ProgID>
             (Default) = <Ver_Dep_ProgID>
    
    HKEY_CLASSES_ROOT
       {CLSID_1}
          <ShellFolder>
             Attributes = dword:a0180000
    
    HKEY_CLASSES_ROOT
       {CLSID_1}
          TypeLib
             (Default) = {LIBID of PH Component}
    
    HKEY_CLASSES_ROOT
       {CLSID_1}
          VersionIndependentProgID
             (Default) = <Ver_Ind_ProgID>
    
  4. Windows Search에 프로토콜 처리기를 등록합니다. 다음 예제에서 프로토콜 이름은> 파일, <mapi 등과 같은 프로토콜 자체의 이름입니다.

    HKEY_LOCAL_MACHINE
       SOFTWARE
          Microsoft
             Windows Search
                ProtocolHandlers
                   <Protocol Name> = <Ver_Dep_ProgID>
    
    HKEY_CURRENT_USER
       SOFTWARE
          Microsoft
             Windows Search
                ProtocolHandlers
                   <Protocol Name> = <Ver_Dep_ProgID>
    

    Windows Vista 이전:

    HKEY_CURRENT_USER
       SOFTWARE
          Microsoft
             Windows Desktop Search
                DS
                   Index
                      ProtocolHandlers
                         <Protocol Name>
                            HasRequirements = dword:00000000
                            HasStartPage = dword:00000000
    

프로토콜 처리기의 파일 형식 처리기 등록

프로토콜 처리기의 파일 형식 처리기(셸 확장명이라고도 함)를 등록하려면 레지스트리에 두 개의 항목을 만들어야 합니다.

  1. HKEY_LOCAL_MACHINE
       SOFTWARE
          Microsoft
             Windows
                CurrentVersion
                   Explorer
                      Desktop
                         NameSpace
                            {CLSID of PH Implementation}
                               (Default) = <Shell Implementation Description>
    
  2. HKEY_LOCAL_MACHINE
       SOFTWARE
          Microsoft
             Windows
                CurrentVersion
                   Explorer
                      Shell Extensions
                         Approved
                            {CLSID of PH Implementation} = <Shell Implementation Description>
    

항목이 인덱싱되는지 확인

프로토콜 처리기를 구현한 후에는 프로토콜 처리기가 인덱싱할 셸 항목을 지정해야 합니다. 카탈로그 관리자를 사용하여 다시 인덱싱을 시작할 수 있습니다(자세한 내용은 카탈로그 관리자 사용 참조). 또는 CSM(크롤링 범위 관리자)을 사용하여 인덱서가 크롤링할 URL을 나타내는 기본 규칙을 설정할 수도 있습니다(자세한 내용은 크롤링 범위 관리자 사용 및 범위 규칙 관리 참조). 검색 루트를 추가할 수도 있습니다(자세한 내용은 검색 루트 관리 참조). 사용할 수 있는 또 다른 옵션은 Windows 검색 코드 샘플의 ReIndex 샘플에 있는 절차를 따르는 것입니다.

ISearchCrawlScopeManager 인터페이스는 크롤링 및/또는 감시할 컨테이너의 검색 엔진에 알리는 메서드와 크롤링 또는 감시 시 포함하거나 제외할 해당 컨테이너 아래의 항목을 제공합니다. Windows 7 이상에서 ISearchCrawlScopeManager2는 버전을 가져오는 ISearchCrawlScopeManager2::GetVersion 메서드를 사용하여 ISearchCrawlScopeManager를 확장하여 CSM의 상태가 변경되었는지 여부를 클라이언트에 알릴 수 있습니다.

개념

프로토콜 처리기 이해

프로토콜 처리기 개발

변경 내용 인덱스 알림

아이콘 및 상황에 맞는 메뉴 추가

코드 샘플: 프로토콜 처리기용 셸 확장

프로토콜 처리기에 대한 검색 커넥트or 만들기

프로토콜 처리기 디버깅