Protokol işleyicilerini yükleme ve kaydetme (Windows Search)

Protokol işleyicisi yüklemek, DLL'leri Program Files dizininde uygun bir konuma kopyalamayı ve ardından protokol işleyicisini kayıt defteri aracılığıyla kaydetmeyi içerir. Yükleme uygulaması, Kabuk veri kaynağı için varsayılan gezinme kapsamını tanımlamak üzere bir arama kökü ve kapsam kuralları da ekleyebilir.

Bu konu aşağıdaki gibi düzenlenmiştir:

URL'ler hakkında

Windows Search, Kabuk veri kaynağınızın hiyerarşisindeki öğeleri benzersiz olarak tanımlamak için URL'leri kullanır. Hiyerarşideki ilk düğüm olan URL,arama kökolarak adlandırılır; Windows Search, arama kökünde dizin oluşturma işlemine başlar ve protokol işleyicisinin her URL için alt bağlantıları listelemesini isteyebilir.

Tipik URL yapısı şöyledir:

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

URL söz dizimi aşağıdaki tabloda açıklanmıştır.

Sözdizimi Açıklama
<protokol> URL için çağrılacak protokol işleyicisini tanımlar.
{user SID} Protokol işleyicisinin çağrıldığı kullanıcı güvenlik bağlamını tanımlar. Kullanıcı güvenlik tanımlayıcısı (SID) tanımlanmazsa, protokol işleyicisi sistem hizmetinin güvenlik bağlamında çağrılır.
<yol> Mağaza hiyerarşisini, her bir eğik çizginin ('/') klasör adları arasında ayraç olarak kullanıldığı şekilde tanımlar.
<Öğe Kimliği> Alt öğeyi (örneğin, dosya adı) tanımlayan benzersiz bir dizeyi temsil eder.

 

Windows Search Dizin Oluşturucu, URL'lerden son eğik çizgiyi kırpır. Sonuç olarak, bir dizini veya öğeyi ayırt etmek için son eğik çizginin varlığına güvenemezsiniz. Protokol işleyicinizin bu URL söz dizimini işleyebilmesi gerekir. Shell veri kaynağınızı tanımlamak için seçtiğiniz protokol adının geçerli adlarla çakışmadığından emin olun. Şu adlandırma kuralını öneririz: companyName.scheme.

Daha fazla bilgi için, bir Shell veri kaynağı oluşturma hakkında (bkz. Temel Klasör Nesne Arabirimlerini Uygulama).

Protokol işleyici arabirimlerini uygulama

Protokol işleyicisi oluşturmak için aşağıdaki üç arabirimin uygulanması gerekir:

Listelenen üç zorunlu arabirim dışında, diğer arabirimler isteğe bağlıdır ve elinizdeki görev için en uygun olan isteğe bağlı arabirimleri uygulama özgürlüğüne sahipsiniz.

ISearchProtocol ve ISearchProtocol2

SearchProtocol arabirimleri, protokol işleyici urlAccessor nesnelerinizi başlatır ve yönetir. ISearchProtocol2 arabirimi, ISearchProtocolisteğe bağlı bir uzantısıdır ve kullanıcı ve öğe hakkında daha fazla bilgi belirtmek için ek bir yöntem içerir.

Iurlaccessor, iurlaccessor2, iurlaccessor3 ve IUrlAccessor4

IUrlAccessor arabirimleri aşağıdaki tabloda açıklanmıştır.

Arayüz Açıklama
IUrlAccessor Belirtilen URL için IUrlAccessor arabirimi, URL'de gösterilen öğenin özelliklerine erişim sağlar. Ayrıca bu özellikleri protokol işleyicisine özgü bir filtreye (dosya adıyla ilişkilendirilmiş filtre dışında bir filtre) bağlayabilir.
IUrlAccessor2 (isteğe bağlı) IUrlAccessor2 arabirimi, öğenin özellikleri ve görüntüleme URL'si için bir kod sayfası elde eden ve URL'deki öğenin türünü (belge veya dizin) belirleyen yöntemlerle IUrlAccessor genişletir.
IUrlAccessor3 (isteğe bağlı) IUrlAccessor3 arabirimi, IUrlAccessor2kullanıcı SID'leri dizisi alan bir yöntemle genişletir ve arama protokolü ana bilgisayarının bu kullanıcıların kimliğine bürünerek öğeyi dizine almasını sağlar.
IUrlAccessor4 (isteğe bağlı) IUrlAccessor4 arabirimi, IUrlAccessor3 arabiriminin işlevselliğini, öğenin içeriğinin dizine alınıp alınmayacağını tanımlayan bir yöntemle genişletir.

 

UrlAccessor nesnesi, bir SearchProtocol nesnesi tarafından örneklenir ve başlatılır. IUrlAccessor arabirimleri, aşağıdaki tabloda açıklanan yöntemler aracılığıyla önemli bilgilere erişim sağlar.

Yöntem Açıklama
IUrlAccessor::GetLastModified URL'nin en son değiştirildiği saati döndürür. Bu süre, dizin oluşturucunun bu URL'yi son işlediğinden daha yeniyse, filtre işleyicileri (IFilter arabiriminin uygulamaları) bu öğenin değiştirilmiş verilerini ayıklamak için çağrılır. Dizinler için değiştirilen saatler yoksayılır.
IUrlAccessor::IsDirectory URL'nin alt URL'leri içeren bir klasörü temsil edip etmediğini tanımlar.
IUrlAccessor::BindToStream Özel veri deposundaki bir dosyanın verilerini temsil eden bir IStream arabirimine bağlar.
IUrlAccessor::BindToFilter protokol işleyicisine özgü IFilter, öğenin özelliklerini kullanıma sunan bir bağlayandır.
IUrlAccessor4::ShouldIndexItemContent Öğenin içeriğinin dizine alınıp alınmayacağını tanımlar.

 

IProtocolHandlerSite

IProtocolHandlerSite arabirimi, yalıtılmış bir işlemde barındırılan bir filtre işleyicisinin örneğini oluşturmak için kullanılır. Belirtilen kalıcı sınıf tanımlayıcısı (CLSID), belge depolama sınıfı veya dosya adı uzantısı için uygun filtre işleyicisi alınır. Konak işleminin IFilter bağlanmasını istemenin faydası, konak işleminin uygun bir filtre işleyicisi bulma sürecini yönetebilmesi ve işleyiciyi çağırmada yer alan güvenliği kontrol edebilmesidir.

Kapsayıcılar için filtre işleyicileri uygulama

Hiyerarşik protokol işleyicisi uyguluyorsanız, alt URL'leri numaralandıran bir kapsayıcı için filtre işleyicisi uygulamanız gerekir. Filtre işleyicisi, IFilter arabiriminin bir uygulamasıdır. Numaralandırma süreci, IFilter arabiriminin IFilter::GetChunk ve IFilter::GetValue yöntemlerini içeren bir döngüdür; her alt URL, özelliğin değeri olarak gösterilir.

IFilter::GetChunk kapsayıcının özelliklerini döndürür. Alt URL'leri listelemek için IFilter::GetChunk aşağıdakilerden birini döndürür:

PKEY_Search_UrlToIndexWithModificationTime döndürülmesi daha verimlidir çünkü dizin oluşturucu, ISearchProtocol::CreateAccessor ve IUrlAccessor::GetLastModifiedyöntemlerini çağırmadan öğenin dizine alınması gerekip gerekmediğini hemen belirleyebilir.

Aşağıdaki örnek kod, PKEY_Search_UrlToIndexWithModificationTime özelliğinin nasıl döndürüleceği gösterilmektedir.

Önemli

Telif Hakkı (c) Microsoft Corporation. Tüm hakları saklıdır.

 

// 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;
}

Not

IFilterbileşenikapsayıcı, alt URL'ler değişmemiş olsa bile her zaman tüm alt URL'leri numaralandırmalıdır çünkü dizin oluşturucu numaralandırma işlemi aracılığıyla silmeleri algılar. bir PKEY_Search_UrlToIndexWithModificationTime tarih çıkışı verilerin değişmediğini gösteriyorsa, dizin oluşturucu bu URL'nin verilerini güncelleştirmez.

 

Protokol işleyicisini yükleme ve kaydetme

Protokol işleyicilerinin yüklenmesi, DLL'lerin Program Files dizininde uygun bir konuma kopyalanmasını ve ardından DLL'lerin kaydedilmesini içerir. Protokol işleyicileri, yükleme için kendi kendine kayıt uygulamalıdır. Yükleme uygulaması ayrıca Kabuk veri kaynağı için varsayılan tarama kapsamını tanımlamak amacıyla bir arama kökü ve kapsam kuralları ekleyebilir. Bu konu başlığının sonunda Öğelerinizin Dizinlendiğinden Emin Olmak kısmında bu konu ele alınmaktadır.

Protokol işleyicisini kaydetme yönergeleri

Protokol işleyicisini kaydederken şu yönergeleri izlemeniz gerekir:

  • Yükleyici exe veya MSI yükleyicisi kullanmalıdır.
  • Sürüm notları sağlanmalıdır.
  • Yüklenen her eklenti için Program Ekle/Kaldır girdisi oluşturulmalıdır.
  • Yükleyici, geçerli eklentinin anladığı belirli bir dosya türü veya deposu için tüm kayıt defteri ayarlarını devralmalıdır.
  • Önceki bir eklentinin üzerine yazılıyorsa yükleyicinin kullanıcıya bildirmesi gerekir.
  • Daha yeni bir eklenti önceki eklentinin üzerine yazdıysa, önceki eklentinin işlevselliğini geri yükleme ve bu dosya türü için yeniden varsayılan eklenti yapma özelliği olmalıdır.
  • Yükleyici, Gezinme Kapsamı Yöneticisi'ni (CSM) kullanarak bir arama kökü ve kapsam kuralları ekleyerek dizin oluşturucu için varsayılan gezinme kapsamını tanımlamalıdır.

Protokol işleyicisini kaydetme

Protokol işleyici bileşenini kaydetmek için kayıt defterinde on dört girdi oluşturmanız gerekir; burada:

  • Ver_Ind_ProgID, protokol işleyicisi uygulamasının sürümden bağımsız ProgID değeridir.
  • Ver_Dep_ProgID, protokol işleyicisi uygulamasının sürüme bağımlı ProgID'dir.
  • CLSID_1, protokol işleyicisi uygulamasının CLSID değeridir.

Protokol işleyicisini kaydetmek için:

  1. Sürümden bağımsız ProgID'yi aşağıdaki anahtarlar ve değerlerle kaydedin:

    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. Sürüme bağımlı ProgID'yi aşağıdaki anahtarlar ve değerlerle kaydedin:

    HKEY_CLASSES_ROOT
       <Ver_Dep_ProgID>
          (Default) = <Protocol Handler Class Description>
    
    HKEY_CLASSES_ROOT
       <Ver_Dep_ProgID>
          CLSID
             (Default) = {CLSID_1}
    
  3. Protokol işleyicisinin CLSID'sini aşağıdaki anahtarlar ve değerlerle kaydedin:

    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. Protokol işleyicisini Windows Search'e kaydedin. Aşağıdaki örnekte, <Protokol Adı>, dosya, mapi ve benzeri gibi protokole verilen isimdir:

    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'nın öncesinde:

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

Protokol işleyicisinin dosya türü işleyicisini kaydetme

Protokol işleyicisinin dosya türü işleyicisini (Kabuk uzantısı olarak da bilinir) kaydetmek için kayıt defterinde iki giriş yapmanız gerekir.

  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>
    

Öğelerinizin dizine alınmasını sağlama

Protokol işleyicinizi uyguladıktan sonra, protokol işleyicinizin dizine eklenecek Windows Kabuk öğelerini belirlemeniz gerekir. Yeniden dizin oluşturmayı başlatmak için Katalog Yöneticisi'ni kullanabilirsiniz (daha fazla bilgi için bkz. Katalog Yöneticisi'ni kullanma). İsterseniz, dizin oluşturucunun gezinmesini istediğiniz URL'leri belirten varsayılan kuralları ayarlamak için Gezinme Kapsamı Yöneticisi'ni (CSM) de kullanabilirsiniz (daha fazla bilgi için bkz. Gezinme Kapsamı Yöneticisi kullanma ve Kapsam Kurallarını Yönetme). Ayrıca bir arama kökü de ekleyebilirsiniz (daha fazla bilgi için bkz. Arama Köklerini Yönetme). Kullanabileceğiniz bir diğer seçenek de Windows Arama Kodu Örnekleriiçindeki ReIndex örneğindeki yordamı izlemektir.

ISearchCrawlScopeManager arabirimi, arama motoruna taranacak ve/veya izlenecek kapsayıcıları ve bu kapsayıcıların altındaki dahil edilecek veya hariç tutulacak öğeleri bildiren yöntemler sağlar. Windows 7 ve sonraki sürümlerde ISearchCrawlScopeManager2, ISearchCrawlScopeManager'yi ISearchCrawlScopeManager2::GetVersion yöntemi ile genişleterek, istemcilere CSM durumunun değişip değişmediğini bildirir.

kavramsal

Protokol İşleyicilerini Anlama

Protokol İşleyicileri Geliştirme

Değişiklik Dizinine Bildirme

Simge ve Bağlam Menüleri Ekleme

Kod Örneği: Protokol İşleyicileri için Kabuk Uzantıları

Protokol İşleyicisi için Arama Bağlayıcısı Oluşturma

Hata Ayıklama Protokol İşleyicileri