Szűrőkezelők implementálása a Windows Searchben

Fontos, hogy megértse a szűrőkezelő szükséges DLL-struktúráját (az IFilter felület implementációját).

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

A DLL belépési pontjainak implementálása és exportálása

Minden IFilter DLL-nek (amelyet ebben a szakaszban Ifilter.dll jelöl) implementálnia és exportálnia kell a következő belépési pontokat. Ezeket a belépési pontokat általában egy moduldefiníciós (.def) fájllal exportálják az IFilter interfészhez, vagy a __declspec(dllexport) kulcsszóval. A DLL-fájl bármely mappában regisztrálható, de általában a %SystemRoot%\system32 mappában található.

A DLL belépési pontjait az alábbi táblázat sorolja fel és ismerteti.

DLL-név DLL-leírás
DllRegisterServer A DllRegisterServer belépési pont szűrőként regisztrálja a DLL-t a beállításjegyzékben. A DLL-t úgy regisztrálja, hogy a regsvr32.exe programot az IFilter felületi DLL-fájlnévvel argumentumként futtatja: regsvr32.exe %SystemRoot%\system32\Ifilter.dll
DllUnregisterServer függvény A DllUnregisterServer függvény belépési pont eltávolítja a DLL-t állandó kezelőként a beállításjegyzékben. A DLL regisztrációjának megszüntetéséhez futtassa a regsvr32.exe programot a /u jelzővel: regsvr32.exe /u %SystemRoot%\system32\Ifilter.dll
DllGetClassObject függvény A tartalomindexelő ügyfél meghívja a DllGetClassObject függvényt belépési pontját a Component Object Model (COM) használatával, hogy létrehozhasson egy osztály-előállító objektumot az IFilter interfészhez, és mutatót kapjon az objektum osztály-előállító felületéhez.
DllCanUnloadNow függvény A tartalomindexelő ügyfél a COM-on keresztül meghívja a DllCanUnloadNow függvényt belépési pontot annak megállapításához, hogy lehetséges-e eltávolítani az IFilter DLL-t. Az IFilter interfész eltávolításra kerül, miután egy meghatározott ideig nincs használatban, amit a FilterIdleTimeOut beállításjegyzék-érték határoz meg.

Az IFilter osztály és osztálygyár implementálása

Az egyes IFilter- DLL-ek általában legalább két osztályt implementálnak, például a CFiltert és a CFilterCF-t. A CFilter osztály létrehozza az IFilter felületobjektumot, amely megvalósítja a tartalomszűrési funkciót. Tagfüggvényei implementálják az IFilter felületi módszereit. Minden IFilter osztályhoz egyedi osztályazonosító (CLSID) szükséges, amelyet az IFilter felület implementátora hoz létre.

A CFilterCF osztály létrehozza a class-factory objektumot az IFilter interfészhez. Az osztálygyárat a DLL DllGetClassObject függvényének belépési pontja hívja meg a IClassFactory Interface interfészen keresztül. A CFilterCF osztály létrehozza a CFilter objektumot, és egy mutatót ad vissza IUnknown. Összetettebb esetekben az IFilter az egyetlen CFilter-osztály helyett osztályhierarchiát implementálhatnak.

A COM-felületek öröklése

A Windows Search 3.0 és az újabb verziók esetében az alábbi okokból kell az IPersistStream-t használnia:

  • A teljesítmény és a jövőbeli kompatibilitás biztosítása.
  • A biztonság növelése érdekében. A IPersistStream által implementált IFilterek biztonságosabbak, mivel az iFilterfelület futtatásához nincs szükség fájlok lemezen vagy hálózaton keresztüli megnyitására vonatkozó jogosultságokra.
  • Bár a Windows Search csak IPersistStreamhasznál, az IFilter interfészosztály a IPersistFile interface és/vagy IPersistStorage interface interfész implementációit is örökölheti a visszamenőleges kompatibilitás érdekében.

Ezek az interfészek az mssdk\include könyvtárból származó fájlokban vannak deklarálva, és előre definiált felületazonosítókkal (IID-kkel) rendelkeznek. A tartalomindexelő ügyfél lekérdezi a IFilter interfészt IUnknown segítségével, hogy meghatározza, melyik felületet használja a tartalom szűréséhez.

A COM-felület módszereinek implementálása

Az IFilter interfész implementálja az IUnknown metódusokat az IFilter interfészosztályhoz és az IFilter interfészosztály-előállítóhoz. Az alábbi táblázat vtable sorrendben felsorolja az IFilter felületspecifikus interfészeket és metódusokat, amelyeket az IFilter interfésznek implementálnia kell. Az IFilter felületnek legalább IPersistStreamkell implementálnia, de további IPersist-alapú interfészeket is implementálhat.

COM-felület Módszer
IClassFactory felület CreateInstance, LockServer
IClassFactory2 interfész GetLicInfo, RequestLicKey, CreateInstanceLic
IFilter IFilter::Init, IFilter::GetChunk, IFilter::GetText, IFilter::GetValue, IFilter::BindRegion
IPersist felület GetClassID
IPersistFile felület IsDirty, Load, Save, SaveCompleted, GetCurFile
IPersistStorage interfész IsDirty, Load, Save, GetSizeMax
IPersistStream IsDirty, Load, Save, GetSizeMax

Az egyes metódusok referenciaoldala az adott metódus paramétereit és működési viselkedését határozza meg. Minden referenciaoldal megadja az adott metódushoz implementálandó eredménykódokat is. Az IFilter metódusok referenciaoldalai lehetővé teszik a FACILITY_ITF eredménykódok felületspecifikus kódjainak implementálását, és a tartalomindexelő ügyfél képes kezelni az általános eredménykódokat is, például FACILITY_NULL és FACILITY_WIN32. További információ: COM-hibakódok struktúrája.

Nem implementált COM-metódusok

Az IFilter felületnek legalább IPersistStreamkell implementálnia, de nem kell további IPersist-alapú interfészeket implementálnia.

A Windows Searchnek nem kell implementálnia az alábbi táblázatban felsorolt COM-metódusokat.

Nem kötelező metódus Leírás
IPersistStream::IsDirty A szűrőknek E_NOTIMPL kell visszaadnia.
IPersistStream::Save A szűrőknek E_NOTIMPL kell visszaadnia.
IPersistStream::GetSizeMax A szűrőknek E_NOTIMPL kell visszaadnia.
IFilter::BindRegion A szűrőknek E_NOTIMPL kell visszaadnia.

További erőforrások

Szűrőkezelők fejlesztése

Szűrőkezelők ismertetése a Windows Search

Ajánlott eljárások a szűrőkezelőkhöz a Windows Keresésben

Tulajdonságok visszaadása a szűrőkezelő eljárásból

Windows rendszerrel érkező szűrőkezelők

Szűrőkezelők regisztrálása

Szűrőkezelők tesztelése