Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
- DLL belépési pontok implementálása és exportálása
- Az IFilter Osztály és a Class Factory implementálása
- COM-felületek öröklése
- COM-felületi módszerek implementálása
- További erőforrások
- Kapcsolódó témakörök
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
- A GitHub IFilterSample kódmintája bemutatja, hogyan hozhat létre IFilter alaposztályt az IFilter felület implementálásához.
- Az indexelési folyamat áttekintését az Az indexelési folyamatcímű cikkben tekintheti meg.
- A fájltípusok áttekintését a fájltípusokcímű témakörben talál.
- A fájltípus fájltársítási attribútumainak lekérdezéséhez lásd: Érzékelt típusok, SystemFileAssociations és Alkalmazásregisztráció.
Kapcsolódó témakörök
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