Sdílet prostřednictvím


Vývoj doplňků IFilter

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.

Službu Microsoft Windows Desktop Search (WDS) můžete rozšířit o doplňky filtru, komponenty, které implementují rozhraní IFilter, aby zahrnovaly nové typy souborů. Filtry zodpovídají za přístup k datům v souborech a k analýze dat a k vrácení párů vlastností a hodnot a za indexování bloků textu. Během procesu indexování služba WDS volá příslušný filtr s adresou URL pro každý soubor nebo položku. Filtr nejprve extrahuje metadata odpovídající vlastnostem, které jsou označené jako načítané ve schématu WDS, jako je název, velikost souboru a datum poslední změny. Potom rozdělí obsah položky do bloků textu. Služba WDS přidá vlastnosti a text vrácený filtrem do katalogu. WDS může indexovat libovolný typ souboru, pro který má zaregistrovaný filtr.

V některých případech nemusíte psát nový filtr. WDS 2.x obsahuje filtry pro více než 200 typů položek (včetně položek prostého textu, jako jsou soubory HTML, XML a zdrojového kódu) a používá stejnou technologii IFilterjako SharePoint Services. Pokud už máte pro vaše typy souborů nainstalované filtry, může WDS použít tyto existující filtry k indexování těchto dat. Kromě toho WDS obsahuje obecný filtr pro typy souborů, které jsou založené na prostém textu. Pokud máte typ souboru, který je možné zpracovat buď existujícím filtrem služby SharePoint Services, nebo filtrem prostého textu, můžete do registru přidat příponu názvu souboru a identifikátor GUID filtru, aby ho služba WDS dokázala najít a použít (další informace najdete v tématu Registrace doplňku filtru).

Pokud však máte jiný formát než prostý text a proprietární data nebo soubor, zápis vlastní implementace filtru je jediný způsob, jak zajistit, aby WDS mohl indexovat formát souboru v katalogu. Pro typ souboru můžete mít jenom jeden doplněk filtru, takže je možné přepsat existující filtr nebo přepsat jiný filtr pro určitý typ souboru.

Tato část obsahuje následující témata:

Požadovaná rozhraní filtru

Doplněk filtru musí implementovat rozhraní IFiltera jedno z následujících rozhraní:

  • IPersistStream – načtení dat z datového proudu. To je bezpečnější než použití souborů, protože se nic nepíše na disk. Rozhraní IPersistStream je preferovanou metodou pro zajištění budoucí kompatibility ve Windows Vista.
  • rozhraní IPersistFile – načtení dat ze souboru. Toto rozhraní není v systému Windows Vista podporováno.
  • rozhraní IPersistStorage – načtení dat ze strukturovaného úložiště OLE COM.

Doplněk filtru pomocí těchto rozhraní získá obsah položky a vrátí je iterativním způsobem do indexu, dokud nebude dosaženo konce souboru. Doplněk filtru by měl být co nej robustnější pro zpracování poškozených souborů a těch, které nesplňují očekávané vstupní formáty.

IFilter – rozhraní

Toto je požadované rozhraní pro implementaci filtru. Další informace najdete v referenčních informacích k rozhraní IFilter.

Metoda Popis
Init() Inicializuje relaci filtrování.
GetChunk() Umístí filtr na začátek prvního nebo dalšího bloku dat a vrátí popisovač.
GetText() Načte text z aktuálního bloku dat.
GetValue() Načte hodnoty vlastností z aktuálního bloku dat.
BindRegion() Aktuálně vyhrazeno pro interní použití; neimplementujte. Tato metoda vrátí E_NOTIMPL.

 

IPersistStream

Toto rozhraní načte soubor ze streamu pro bezpečnější zpracování než rozhraní IPersistFile, protože kontext, ve kterém IPersistStream filtr spouští, nepotřebuje práva k otevření souborů na disku nebo v síti. Z těchto dvou metod přístupu k jednomu souboru je tato upřednostňována pro budoucí kompatibilitu s Windows.

Metoda Popis
IsDirty() Zkontroluje, jestli došlo ke změně. Tato metoda vrátí E_NOTIMPL u filtrů.
InitNew() Vytvoří nové úložiště. Tato metoda vrátí E_NOTIMPL ve filtrech.
Load() Inicializuje objekt z datového toku, ve kterém byl původně uložen.
Save() Uloží objekt do zadaného datového proudu a označuje, jestli má objekt resetovat příznak dirty. Tato metoda ve filtrech vrací E_NOTIMPL.
GetSizeMax() Vrátí velikost v bajtech datového proudu potřebného k uložení objektu. Metoda vráti E_NOTIMPL ve filtrech.

 

IPersistFile

Toto rozhraní načte soubor absolutní cestou a není podporováno v systému Windows Vista.

Metoda Popis
GetCurFile() Získá aktuální název souboru přidruženého k objektu. Vrátí cestu zadanou v load().
Load() Otevře zadaný soubor a inicializuje objekt z obsahu souboru. Otevření souboru můžete zpozdit, dokud ho nepotřebujete.
GetClassID() Vrátí identifikátor třídy (CLSID) pro nový typ souboru. K vygenerování jedinečného IDENTIFIKÁTORu CLSID byste měli použít uuidgen.exe.
IsDirty() Potřebujete vrátit jenom E_NOTIMPL ve filtrech.
Save() Je potřeba vrátit pouze E_NOTIMPL ve filtrech.
SaveCompleted() Potřebujete vrátit jenom E_NOTIMPL ve filtrech.

 

IPersistStorage

Toto rozhraní podporuje model strukturovaného úložiště, ve kterém má každý obsažený objekt vlastní úložiště, které je vnořené do úložiště kontejneru. Podobně jako IPersistFile Interface, toto rozhraní se načte absolutní cestou a není podporováno v systému Windows Vista.

Metoda Popis
IsDirty() Zkontroluje, jestli došlo ke změně. Tato metoda vrátí E_NOTIMPL ve filtrech.
InitNew() Vytvoří nové úložiště. Tato metoda vrátí E_NOTIMPL ve filtrech.
Load() Šetří úložný prostor. Tato metoda vrátí E_NOTIMPL ve filtrech.
Save() Vrátí velikost v bajtech datového proudu potřebného k uložení objektu. Tato metoda vrátí E_NOTIMPL u filtrů.
SaveCompleted() Vyhrazeno pro interní použití. Tato metoda vrátí E_NOTIMPL v rámci filtrů.
HandsOffStorage() Vyhrazeno pro interní použití. Tato metoda vrátí E_NOTIMPL v rámci filtrů.

 

Výstup vlastností pomocí filtrů

Účelem filtru je extrahovat obsah a vlastnosti souborů pro zahrnutí do fulltextového indexu. WDS nejprve volá metodu Load z implementací IPersistFile, IPersistStream nebo IPersistStorage, a pak vyvolá metodu Init z implementace IFilter. GetChunk se volá k načtení bloků textových nebo dat hodnot vlastností, a pak se GetText nebo GetValue volá tolikrát, kolikrát je potřeba k načtení všech textových údajů nebo hodnot vlastností přidružených k bloku. Tento proces se opakuje, dokud funkce GetChunk neoznámí, že v dokumentu nejsou žádné další části.

Metoda GetChunk načte informace o prvním nebo dalším logickém bloku informací ze souboru, který se filtruje, a vrátí tyto informace v STAT_CHUNK struktuře, včetně monotonicky rostoucího ID bloku dat, informací o stavu o tom, jak aktuální blok dat souvisí s předchozím blokem dat, příznak označující, zda blok dat obsahuje text nebo hodnotu, národní prostředí bloku a specifikace vlastnosti bloku dat. Specifikace vlastnosti je FULLPROPSPEC sestávající z CLSID a identifikátoru celočíselné nebo řetězcové vlastnosti (například D5CDD505-2E9C-101B-9397-08002B2CF9AE/PerceivedType). Identifikuje typ vlastnosti, nikoli samotnou hodnotu vlastnosti.

Identifikátor jazykového prostředí chunku se používá k výběru vhodného oddělovače slov a je velmi důležité ho správně identifikovat. Pokud filtr nemůže určit národní prostředí textu, měl by předpokládat výchozí systémové národní prostředí dostupné pomocí GetSystemDefaultLCID. Pokud řídíte formát souboru a aktuálně neobsahuje informace o národním prostředí, měli byste přidat funkci uživatele, která umožní správnou identifikaci národního prostředí. Použití nesprávného mechanismu pro rozdělování slov může vést k neuspokojivému zážitku z dotazu pro uživatele.

GetChunk spravuje pouze přístup k blokům dat a nevrací samotnou hodnotu textu ani vlastnosti. Další volání funkcí GetText a GetValue načtou obsah bloku. GetText vrátí textové bloky, což jsou řetězce Unicode, z aktuálního CHUNK_TEXT bloku dat. Pokud je aktuální blok dat příliš velký, může být vyžadováno více než jedno volání metody GetText. Každé volání metody GetText načte text, který bezprostředně následuje za textem z posledního volání metody GetText. Například poslední znak z jednoho volání může být uprostřed slova a první znak v dalším volání bude pokračovat v tomto slově. Vyhledávací weby musí tuto situaci zvládnout.

GetValue vrátí hodnoty vlastností pro aktuální CHUNK_VALUE blok dat ve strukturách PROPVARIANT, které mohou obsahovat širokou škálu datových typů. GetValue musí sama sobě přidělit strukturu PROPVARIANT pomocí CoTaskMemAlloc. Volající GetValue je zodpovědný za uvolnění paměti odkazované PROPVARIANT pomocí PropVariantClear a za uvolnění samotné struktury pomocí CoTaskMemFree. Další informace o PROPVARIANTs naleznete v PROPVARIANT reference.

Hodnoty vlastností

Filtry by měly výstupovat minimálně následující vlastnosti, které jsou výchozími sloupci v zobrazení výsledků služby WDS.

Identifikátor GUID PROPSPEC Srozumitelný název Popis
F29F85E0-4FF9-1068-AB91-08002B27B3D9 2 Primární název Název, který se zobrazí pro tuto položku
F29F85E0-4FF9-1068-AB91-08002B27B3D9 4 Hlavní autoři Osoba přidružená k této položce
D5CDD505-2E9C-101B-9397-08002B2CF9AE PrimárníDatum HlavníDatum Nejdůležitější datum položky, jako je datum přijetí e-mailu nebo datum změny souborů.
D5CDD505-2E9C-101B-9397-08002B2CF9AE Vnímaný typ Vnímaný typ Typ analyzovaného souboru Musí odpovídat jednomu z typů Windows Desktop Search uvedených ve WDS Vnímaný typ.

 

U položek prostého textu služba WDS extrahuje všechny vlastnosti definované textem a systémem, jako je velikost souboru nebo přípona, včetně nových typů souborů prostého textu do indexu). Mezi další typy vlastností, které lze vrátit do indexu, patří:

  • Soubory: autor, název, stav, klíčová slova
  • Pro média: album, žánr, výrobce kamery, datum pořízení
  • Pro komunikaci: from, to, cc, důležitost
  • Kontakty: pracovní pozice, telefon do zaměstnání, společnost

Seznam výše seskupuje vlastnosti společné pro zadaný vnímaný typ; lze však použít libovolnou vlastnost bez ohledu na typ. Společnost může být například použita pro jméno zaměstnavatele kontaktu a může se také použít k odkazování na jméno klienta, se které soubor týká. Mnoho z těchto vlastností se používá k zobrazení výsledků hledání v zobrazení výsledků služby WDS. Například vlastnost Název souboru se zobrazí jako hlavní sloupec ve výchozím zobrazení výsledků. Objekty IFilter by měly generovat výstup všech vlastností souvisejících s typem položky, které analyzují. Ve službě WDS 2.x nelze přidat vlastní vlastnosti. Úplný seznam dostupných vlastností naleznete v schématu WDS.

Instalace doplňku filtru

Instalace filtru zahrnuje zkopírování knihovny DLL do příslušného umístění v adresáři Program Files a jeho registraci. Filtry by měly implementovat samoobslužnou registraci pro instalaci a měly by postupovat podle těchto pokynů:

  • Instalační program musí používat instalační program EXE nebo MSI.
  • Je nutné poskytnout poznámky k vydání.
  • Přidat nebo odebrat programy položka musí být vytvořena pro každý nainstalovaný doplněk.
  • Instalační program musí převzít všechna nastavení registru pro konkrétní typ souboru nebo úložiště, se kterým aktuální doplněk pracuje.
  • Pokud se předchozí doplněk přepíše, měl by instalační program uživatele upozornit.
  • Pokud novější doplněk přepsal předchozí doplněk, měli byste mít možnost obnovit funkce předchozího doplňku a nastavit ho jako výchozí doplněk pro tento typ souboru nebo znovu uložit.

Identifikátory CLSI vyžadované pro registraci

Ke každému filtru jsou přidruženy tři identifikátory tříd nebo identifikátory CLSI. K registraci doplňku filtru budete muset vygenerovat jednu nebo více z nich (použít uuidgen.exe).

  • První identifikuje trvalou obslužnou rutinu všech filtrů, IID_IFilter, což je {89BCB740-6119-101A-BCB7-00DD010655AF}. Tento CLSID je konstantní pro všechny filtry, které implementují IFilter.
  • Druhá (hodnota klíče IID_IFilter) identifikuje implementaci IFilter pro váš typ souboru. Tento klíč obsahuje hodnotu InprocServer32, která určuje název knihovny DLL podle dané cesty a vláknový model. Pokud je filtr v systémové cestě, například v adresáři system32, stačí název souboru. Jinak by tato hodnota měla mít úplnou specifikaci cesty.
  • Třetí identifikuje typ souboru, který filtr zpracovává a je vrácen metodou GetClassID v rozhraní IPersist.

Poznámka

V budoucích verzích operačních systémů Microsoftu může být instalace souborů v adresáři system32 obtížnější, proto doporučujeme je nainstalovat do programových souborů a zahrnout úplnou cestu k filtru v registru. Z bezpečnostních důvodů je také rozumné specifikovat úplnou cestu k vaší DLL v registru. V opačném případě může být načtena verze trojského koně vaší DLL, jestliže se nachází v cestě procesu načítání před vaší verzí.

 

Registrační model

Když je WDS připraven k filtrování souboru, hledá v registru pod příponou souboru, aby určil, který filtr se má načíst. Pak následuje série záznamů registru, aby našel název knihovny DLL pro filtr, a to v tomto pořadí:

  1. Z identifikátorů CLSID umístěných na adrese:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

  2. Z typu obsahu souboru na adrese:

    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Content Type

  3. Z přípony názvu souboru (stejné jako rozhraní API Win32 LoadIFilter) na adrese:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

    HKEY_CLASSES_ROOT\extpersistentHandler–>CLSID–>IID_IFilter> CLSID

  4. Ve výchozím nastavení:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

Chcete-li zaregistrovat doplněk filtru

Abyste mohli zaregistrovat filtrový doplněk, musíte v registru vytvořit celkem osm položek, kde:

  • .ext je nová přípona názvu souboru.
  • GUID_1 může být jakýkoli nový identifikátor GUID vytvořený pro toto rozšíření.
  • 89BCB740-6119-101A-BCB7-00DD010655AF je identifikátor GUID rozhraní IFilter, což je konstanta pro všechny implementace IFilter.
  1. Zaregistrujte trvalou obslužnou rutinu pro příponu názvu souboru s následujícími klíči a hodnotami:

    HKEY_CLASSES_ROOT\<.ext>\PersistentHandler
       (Default) = {GUID_1}
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}
       (Default) = <Persistent Handler Description>
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered
       (Default) = (Value Not Set)
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered\{89BCB740-6119-101A-BCB7-00DD010655AF}
       (Default) = {CLSID of IFilter implementation}
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentHandler
       (Default) = {GUID_1}
    
  2. Zaregistrujte implementaci IFilter s následujícími klíči a hodnotami:

    HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}
       (Default) = Extension IFilter Description">
    
    HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}\InprocServer32
       (Default) = <DLL Install Path>
       ThreadingModel = Both
    
  3. Zaregistrujte implementaci IFilter ve službě Windows Desktop Search s následujícím klíčem a hodnotou:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Extension\<.ext>
       (Default) = {CLSID of IFilter implementation}"
    

referenční

tabulka schématu

Vnímané typy

Vývoj zpracovatelů protokolu

další prostředky

IFilter