Protokollkezelők telepítése és regisztrálása (Windows Search)

A protokollkezelő telepítésekor a DLL-eket a Program Files könyvtár megfelelő helyére kell másolni, majd regisztrálni kell a protokollkezelőt a beállításjegyzéken keresztül. A telepítőalkalmazás keresési gyökér- és hatókörszabályokat is hozzáadhat a Shell-adatforrás alapértelmezett bejárási hatókörének meghatározásához.

Ez a témakör a következőképpen van rendszerezve:

Tudnivalók az URL-címekről

A Windows Search URL-címekkel azonosítja a Shell-adatforrás hierarchiájában lévő elemeket. A hierarchia első csomópontjának URL-címét keresési gyökér-nek nevezzük. A Windows Search az indexelést a keresési gyökérnél kezdi, és kéri, hogy a protokollkezelő sorolja fel az egyes URL-címek gyermekhivatkozásait.

A tipikus URL-struktúra a következő:

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

Az URL-szintaxist az alábbi táblázat ismerteti.

Szintaxis Leírás
<protokoll> Meghatározza, hogy melyik protokollkezelőt kell meghívni az URL-címhez.
{user SID} Azonosítja azt a felhasználói biztonsági környezetet, amely alatt a protokollkezelőt meghívják. Ha nincs azonosítva felhasználói biztonsági azonosító (SID), a rendszer meghívja a protokollkezelőt a rendszerszolgáltatás biztonsági környezetében.
<elérési út> Meghatározza az áruház hierarchiáját, ahol minden perjel ('/') egy elválasztó a mappanevek között.
<Tételazonosító> A gyermekelemet (például a fájlnevet) azonosító egyedi karakterláncot jelöli.

 

A Windows Search Indexer levágja a végleges perjelet az URL-címekről. Ennek eredményeképpen nem támaszkodhat arra, hogy a könyvtár és az elem azonosításához van-e záró perjel. A protokollkezelőnek képesnek kell lennie kezelni ezt az URL-szintaxist. Győződjön meg arról, hogy a Shell-adatforrás azonosításához kiválasztott protokollnév nem ütközik az aktuálisakkal. Ezt az elnevezési konvenciót javasoljuk: companyName.scheme.

További információ a Shell-adatforrások létrehozásáról: Az alapszintű mappaobjektum-felületek implementálása.

Protokollkezelő felületek implementálása

A protokollkezelő létrehozásához a következő három felület implementálása szükséges:

  • ISearchProtocol urlAccessor-objektumok kezeléséhez.
  • IUrlAccessor a tulajdonságok felfedéséhez és a Shell-adatforrás elemeinek megfelelő szűrőinek azonosításához.
  • IFilter a védett fájlok szűréséhez, illetve a hierarchikusan tárolt fájlok számbavételéhez és szűréséhez.

A felsorolt három kötelező interfészen kívül a többi interfész nem kötelező, és ön szabadon implementálhatja, hogy melyik választható interfész a legmegfelelőbb a feladathoz.

ISearchProtocol és ISearchProtocol2

A SearchProtocol-felületek inicializálják és kezelik a protokollkezelő URLAccessor-objektumait. Az ISearchProtocol2 felület a ISearchProtocolopcionális bővítménye, és egy további módszert is tartalmaz a felhasználóra és az elemre vonatkozó további információk megadásához.

Iurlaccessor, iurlaccessor2, iurlaccessor3 és IUrlAccessor4

Az IUrlAccessor interfészeket az alábbi táblázat ismerteti.

Interfész Leírás
IUrlAccessor Megadott URL-cím esetén az IUrlAccessor felület hozzáférést biztosít az URL-címben közzétett elem tulajdonságaihoz. Ezeket a tulajdonságokat egy protokollkezelő-specifikus szűrőhöz (vagyis a fájlnévhez társított szűrőn kívüli szűrőhöz) is kötheti.
IUrlAccessor2 (nem kötelező) Az IUrlAccessor2 felület kibővíti IUrlAccessor olyan metódusokkal, amelyek kódlapot kapnak az elem tulajdonságaihoz és megjelenítési URL-címéhez, és amelyek lekérik az URL-címben (dokumentum vagy könyvtár) található elem típusát.
IUrlAccessor3 (nem kötelező) Az IUrlAccessor3 felület kibővíti az IUrlAccessor2 egy olyan módszerrel, amely egy felhasználói SID-ek tömböt ad vissza, lehetővé téve, hogy a keresési protokoll gazdagépe megszemélyesítse ezeket a felhasználókat az elem indexeléséhez.
IUrlAccessor4 (nem kötelező) Az IUrlAccessor4 felület kibővíti az IUrlAccessor3 felület funkcióit egy olyan módszerrel, amely meghatározza, hogy az elem tartalmát indexelni kell-e.

 

Az UrlAccessor objektumot egy SearchProtocol-objektum példányosít és inicializálja. Az IUrlAccessor felületek az alábbi táblázatban ismertetett módszerekkel biztosítják a fontos információkhoz való hozzáférést.

Módszer Leírás
IUrlAccessor::GetLastModified Azt az időpontot adja vissza, amikor az URL-címet legutóbb módosították. Ha ez az idő újabb, mint az indexelő legutóbb feldolgozta ezt az URL-címet, a rendszer meghívja a szűrőkezelőket (a IFilter felület implementációit) az adott elem módosított adatainak kinyerésére. A címtárak módosított időpontjai figyelmen kívül lesznek hagyva.
IUrlAccessor::IsDirectory Meghatározza, hogy az URL-cím gyermek URL-címeket tartalmazó mappát jelöl-e.
IUrlAccessor::BindToStream Egy IStream-felülethez kapcsolódik, amely egy egyéni adattárban lévő fájl adatait jelöli.
IUrlAccessor::BindToFilter Egy protokollkezelő-specifikus IFilter--hoz kapcsolódik, amely elérhetővé teheti az elem tulajdonságait.
IUrlAccessor4::ShouldIndexItemContent Meghatározza, hogy az elem tartalmát indexelni kell-e.

 

IProtocolHandlerSite

Az IProtocolHandlerSite felület egy izolált folyamat által üzemeltetett szűrőkezelő példányosítására szolgál. A rendszer beszerezi a megfelelő szűrőkezelőt egy megadott állandó osztályazonosítóhoz (CLSID), dokumentumtárolási osztályhoz vagy fájlnévkiterjesztéshez. Az az előnye, ha a gazdafolyamatot kérjük meg az iFilterkötésére, hogy a gazdafolyamat felügyelheti a megfelelő szűrőkezelő megkeresésének folyamatát, és szabályozhatja a kezelő meghívásának biztonságát.

Szűrőkezelők implementálása tárolókhoz

Ha hierarchikus protokollkezelőt implementál, akkor egy szűrőkezelőt kell implementálnia egy olyan tárolóhoz, amely számba adja a gyermek URL-címeket. A szűrőkezelő az IFilter felület implementációja. Az enumerálási folyamat az IFilter::GetChunk és IFilter::GetValue metódusai köré szervezett ciklus az IFilter felületen keresztül; minden gyermek URL-cím a tulajdonság értékeként jelenik meg.

IFilter::GetChunk a tároló tulajdonságait adja vissza. A gyermek URL-címek számbavételéhez IFilter::GetChunk az alábbiak egyikét adja vissza:

A PKEY_Search_UrlToIndexWithModificationTime visszaadása hatékonyabb, mert az indexelő azonnal megállapíthatja, hogy az elemet indexelni kell-e az ISearchProtocol::CreateAccessor és IUrlAccessor::GetLastModified metódus meghívása nélkül.

Az alábbi példakód bemutatja, hogyan lehet visszaadni a PKEY_Search_UrlToIndexWithModificationTime tulajdonságot.

Fontos

Copyright (c) Microsoft Corporation. Minden jog fenntartva.

 

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

Jegyzet

Egy tárolónak IFilter összetevőnek mindig számba kell adnia az összes gyermek URL-címet, még akkor is, ha a gyermek URL-címei nem változtak, mert az indexelő az enumerálási folyamat során észleli a törléseket. Ha egy PKEY_Search_UrlToIndexWithModificationTime dátumkimenete azt jelzi, hogy az adatok nem változtak, az indexelő nem frissíti az adott URL-cím adatait.

 

Protokollkezelő telepítése és regisztrálása

A protokollkezelők telepítésével a DLL-eket a Program Files könyvtár megfelelő helyére kell másolni, majd regisztrálni kell a DLL-eket. A protokollkezelőknek önregisztrációt kell implementálniuk a telepítéshez. A telepítőalkalmazás keresési gyökér- és hatókörszabályokat is hozzáadhat a Shell-adatforrás alapértelmezett bejárási hatókörének meghatározásához, amelyről a témakör végén Az elemek indexelésének biztosítása című témakörben olvashat.

Protokollkezelő regisztrálásának irányelvei

Protokollkezelő regisztrálásakor kövesse az alábbi irányelveket:

  • A telepítőnek EXE vagy MSI telepítőt kell használnia.
  • A kibocsátási megjegyzéseket meg kell adni.
  • Minden telepített bővítményhez létre kell hozni egy Programok hozzáadása/eltávolítása bejegyzést.
  • A telepítőnek át kell vennie az aktuális bővítmény által megismert fájltípus vagy -tároló beállításjegyzék-beállításait.
  • Ha felülír egy korábbi bővítményt, a telepítőnek értesítenie kell a felhasználót.
  • Ha egy újabb bővítmény felülírta az előző bővítményt, képesnek kell lennie visszaállítani az előző bővítmény funkcióit, és ismét az adott fájltípus alapértelmezett bővítményének kell lennie.
  • A telepítőnek meg kell határoznia az indexelő alapértelmezett bejárási hatókörét egy keresési gyökér és hatókörszabályok hozzáadásával a Bejárási hatókörkezelő (CSM) használatával.

Protokollkezelő regisztrálása

A protokollkezelő összetevő regisztrálásához tizennélyes bejegyzést kell létrehoznia a beállításjegyzékben, ahol:

  • Ver_Ind_ProgID a protokollkezelő implementáció verziófüggetlen ProgID azonosítója.
  • Ver_Dep_ProgID a protokollkezelő implementáció verziófüggő ProgID azonosítója.
  • CLSID_1 a protokollkezelő implementáció CLSID azonosítója.

Protokollkezelő regisztrálása:

  1. Regisztrálja a verziófüggetlen ProgID-t a következő kulcsokkal és értékekkel:

    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. Regisztrálja a verziófüggő ProgID-t a következő kulcsokkal és értékekkel:

    HKEY_CLASSES_ROOT
       <Ver_Dep_ProgID>
          (Default) = <Protocol Handler Class Description>
    
    HKEY_CLASSES_ROOT
       <Ver_Dep_ProgID>
          CLSID
             (Default) = {CLSID_1}
    
  3. Regisztrálja a protokollkezelő CLSID azonosítóját a következő kulcsokkal és értékekkel:

    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. Regisztrálja a protokollkezelőt a Windows Search szolgáltatásban. Az alábbi példában <protokollnév> maga a protokoll neve, például fájl, mapi stb.:

    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 előtt:

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

A protokollkezelő fájltípus-kezelőjének regisztrálása

A protokollkezelő fájltípus-kezelőjének (más néven Shell-bővítménynek) regisztrálásához két bejegyzést kell létrehoznia a beállításjegyzékben.

  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>
    

Az elemek indexelésének biztosítása

A protokollkezelő implementálása után meg kell adnia, hogy a protokollkezelő mely Shell-elemeket indexelje. A Catalog Managerrel újraindexelést kezdeményezhet (további információ: A Catalog Managerhasználata). A bejárási hatókör-kezelővel (CSM) is beállíthatja az indexelő által bejárni kívánt URL-címeket jelző alapértelmezett szabályokat (további információ: A bejárási hatókör-kezelő és Hatókörszabályok kezelése). Keresési gyökereket is hozzáadhat (további információ: Keresési gyökerek kezelése). Egy másik lehetőség az, hogy kövesse az eljárást a ReIndex mintában Windows keresési kódminták.

Az ISearchCrawlScopeManager felület olyan metódusokat biztosít, amelyek értesítik a keresőmotort a bejárásra és/vagy megtekintésre szolgáló tárolókról, valamint a tárolók alatti elemekről, amelyeket bejárás vagy figyelés során belefoglalnak vagy kizárnak. Windows 7 és újabb verziókban ISearchCrawlScopeManager2 kibővíti ISearchCrawlScopeManager a ISearchCrawlScopeManager2::GetVersion metódussal, amely lekéri a verziót, amely tájékoztatja az ügyfeleket arról, hogy megváltozott-e a CSM állapota.

Koncepcionális

Protokollkezelők ismertetése

Protokollkezelők fejlesztése

Változások indexének értesítése

Ikonok és helyi menük hozzáadása

kódminta: A Protokollkezelők rendszerhéjbővítményei

Keresési összekötő létrehozása egy protokollkezelő számára

hibakeresési protokollkezelők