Implementace obslužné rutiny protokolu pro WDS
Poznámka
Windows Desktop Search 2.x je zastaralá technologie, která byla původně k dispozici jako doplněk pro systém Windows XP a Windows Server 2003. V pozdějších verzích použijte místo toho Windows Search.
Vytvoření obslužné rutiny protokolu zahrnuje implementaci ISearchProtocol pro správu objektů UrlAccessor. IUrlAccessor generovat metadata a identifikovat vhodné filtry pro položky v úložišti dat, IProtocolHandlerSite vytvořit instanci objektu SearchProtocol a identifikovat příslušné filtry a IFilterk filtrování vlastních souborů nebo k vytvoření výčtu a filtrování hierarchicky uložených souborů. Obslužná rutina protokolu musí být vícevláknová.
Tato část obsahuje následující témata:
- poznámka k adresám URL
- rozhraní obsluhovače protokolu
- IFilters pro kontejnery
- Přidání funkčnosti možností obslužné rutiny protokolu
- související témata
Microsoft Windows Desktop Search (WDS) používá adresy URL k jednoznačné identifikaci položek v systému souborů, v úložišti podobném databázi nebo na webu. Adresa URL, která definuje vstupní uzel, se nazývá úvodní stránka; Služba WDS začíná na této úvodní stránce a rekurzivně prochází úložiště dat. Typická struktura adres URL je:
protocol://host/path/name.extension
Poznámka
Pokud chcete přidat nové úložiště dat, budete muset vybrat název, abyste ho identifikovali, který není v konfliktu s aktuálními. Doporučujeme tuto konvenci pojmenování: companyName.scheme.
ISearchProtocol
Rozhraní ISearchProtocol vyvolá, inicializuje a spravuje objekty UrlAccessor. Další informace o implementaci rozhraní ISearchProtocol naleznete v odkazu na referenční rozhraní ISearchProtocol.
IUrlAccessor
Pro zadanou adresu URL rozhraní IUrlAccessor generuje metadata o struktuře umístění i obsažených položkách a sváže tyto položky s filtrem. Objekt IUrlAccessor je instanciován a inicializován objektem SearchProtocol; můžete však také implementovat interní inicializační metodu, aby váš IUrlAccessor objekt mohl provádět specifické inicializační úlohy konkrétní pro vaši obslužnou rutinu protokolu, například ověření adresy URL pro položku, ke které se přistupuje, nebo kontrolu času poslední změny, aby se zjistilo, zda se musí soubor zpracovat při aktuálním procházení.
Poznámka
Změněné časy adresářů se ignorují. Objekt IUrlAccessor musí vytvořit výčet podřízených objektů, aby bylo možné určit, zda došlo k nějakým úpravám nebo odstraněním.
Většina návrhu objektu UrlAccessor závisí na tom, zda je struktura hierarchická nebo založená na propojení. V případě hierarchických úložišť dat musí objekt UrlAccessor najít filtr, který může zobrazit výčet jejich obsahu. Dalším rozdílem mezi hierarchickými a linkovými obslužnými rutinami je použití metody "IsDirectory". V obslužných rutinách protokolu založených na propojení by tato metoda měla vrátit S_FALSE. Obslužné rutiny pro hierarchické protokoly musí vracet S_OK pro kontejnery.
Další pokyny k implementaci rozhraní IUrlAccessor najdete v referenčních informacích k rozhraní IUrlAccessor.
IProtocolHandlerSite
Toto rozhraní slouží k vytvoření instance objektu SearchProtocol a také poskytuje objektu UrlAccessor odpovídající filtr pro zadané ID třídy (CLSID).
Pokud implementujete hierarchickou obslužnou rutinu protokolu, musíte implementovat kontejner IFilterkomponentu, která obsahuje výčet adres URL představujících kontejnery nebo složky. Proces výčtu spočívá ve smyčce přes metody GetChunk a GetValue rozhraní IFilter, které vrací seznam adres URL představujících každou položku v kontejneru.
Za prvé, GetChunk vrátí FULLPROSPEC s nastavenou vlastností GATHER_PROPSET a buď:
- PID_GTHR_DIRLINK, adresu URL položky bez času poslední změny nebo
- PID_GTHR_DIRLINK_WITH_TIME, adresa URL spolu s časem poslední změny
Identifikátor GUID sady vlastností pro GATHER_PROPSET je 0B63E343-9CCC-11D0-BCDB-00805FCCCE04. Vlastnost PROPSPEC je buď PID_GTHR_DIRLINK=2, nebo PID_GTHR_DIRLINK_WITH_TIME = 12 desetinných míst.
Vrácení PID_GTHR_DIRLINK_WITH_TIME je efektivnější, protože indexer může okamžitě určit, jestli je potřeba položku indexovat bez volání metod ISearchProtocol->CreateUrlAccessor() a IUrlAccessor->GetLastModified().
Pak GetValue vrátí PROPVARIANT pro adresu URL (a čas poslední změny, pokud je tento údaj použit), jako:
- VT_LPWSTR, URL adresu podřízené položky nebo
- Vektor URL adresy následovaný FILETIME
Následující ukázkový kód ukazuje, jak sestavit správné PID_GTHR_DIRLINK_WITH_TIME.
Poznámka
TENTO KÓD A INFORMACE JSOU POSKYTOVÁNY "TAK, JAK JSOU" BEZ ZÁRUKY JAKÉHOKOLI DRUHU, AŤ UŽ VYJÁDŘENÉ NEBO PŘEDPOKLÁDANÉ, VČETNĚ, ALE NE OMEZENÉ NA PŘEDPOKLÁDANÉ ZÁRUKY PRODEJNOSTI A/NEBO FITNESS PRO URČITÝ ÚČEL.
Copyright (C) Microsoft. Všechna práva vyhrazena.
// 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;
}
Poznámka
Komponenta kontejneru IFilterby měla vždy vyjmenovat všechny podřízené adresy URL, i když se podřízené adresy URL nezměnily, protože Indexer zjistí odstranění během procesu výčtu. Pokud výstup data v DIR_LINKS_WITH_TIME značí, že se data nezměnila, indexer neaktualizuje data pro danou adresu URL.
Fyzická adresa URL je adresa URL, kterou zpracovává objekt UrlAccessor. Pokud filtr nevygeneruje uživatelsky přívětivou adresu DisplayUrl, služba WDS zobrazí fyzickou adresu URL pro uživatele jako součást výsledků hledání. Schéma WDS obsahuje dvě vlastnosti pro řízení toho, co se zobrazí koncovému uživateli, jak je znázorněno v tabulce níže.
Identifikátor GUID | PROPSPEC | Popis |
---|---|---|
D5CDD505-2E9C-101B-9397-08002B2CF9AE | Zobrazit složku | Cesta ke složce zobrazená uživateli ve výsledcích hledání |
D5CDD505-2E9C-101B-9397-08002B2CF9AE | Název složky | Zobrazovaný název nadřazené složky |
Pokud váš kód nevygeneruje DisplayFolder nebo FolderName, tyto hodnoty se vypočítají z objektu DisplayUrl. Lomítka v adresách URL označují kontejnery v úložišti nebo systému souborů.
Aby obslužná rutina protokolu měla výchozí úvodní stránku (a adresu URL vstupního uzlu), musíte implementovat rozhraní ISearchProtocolOptions. V budoucích verzích WDS toto rozhraní poskytne odkazy na dialogové okno Možnosti pro lepší uživatelský zážitek. Toto rozhraní poskytuje následující funkce:
- Určuje, zda jsou splněny požadavky pro zpracovatele protokolu. Úložiště obslužné rutiny protokolu může například vyžadovat přístup k dané aplikaci kvůli správnému indexování dat aplikace, ale tato aplikace není k dispozici.
- Určuje minimální požadavky, které obslužná rutina protokolu potřebuje ke zpracování položky. Požadavky mohou být vyjádřeny uživatelsky přívětivým a lokalizovaným popisem, například "Microsoft Outlook 2000 nebo vyšší".
- Definuje adresy URL, které má obslužná rutina protokolu zpracovat ve výchozím nastavení.
Následující tabulka popisuje metody, které je potřeba implementovat pro ISearchProtocolOptions rozhraní.
Metoda | Popis |
---|---|
Požadavky na kontrolu | Určuje, jestli jsou splněny minimální požadavky obslužné rutiny vlastního protokolu. |
GetDefaultCrawlScope | Vrátí seznam výchozích adres URL v zadaném úložišti pro vlastní obslužnou rutinu protokolu. |
ZískatPožadavky | Identifikuje uživatelsky přívětivý lokalizovaný popis minimálních požadavků pro vlastní obslužnou rutinu protokolu. |