Bagikan melalui


Menerapkan Handler Filter di Windows Search

Penting bahwa Anda memahami struktur DLL yang diperlukan dari handler filter (implementasi antarmuka IFilter ).

Topik ini diatur sebagai berikut:

Menerapkan dan Mengekspor Titik Masuk DLL

Setiap DLL IFilter (ditandai dengan Ifilter.dll di bagian ini) harus menerapkan dan mengekspor titik masuk berikut. Titik masuk ini biasanya diekspor menggunakan file definisi modul (.def) untuk antarmuka IFilter atau dengan menggunakan kata kunci __declspec(dllexport). File DLL dapat didaftarkan untuk berada di folder apa pun, tetapi biasanya berada di folder %SystemRoot%\system32.

Titik entri DLL dicantumkan dan dijelaskan dalam tabel berikut.

Nama DLL Deskripsi DLL
DllRegisterServer Titik entri DllRegisterServer mendaftarkan DLL sebagai filter dalam registri. Anda mendaftarkan DLL dengan menjalankan program regsvr32.exe dengan nama file DLL antarmuka IFilter sebagai argumen: regsvr32.exe %SystemRoot%\system32\Ifilter.dll
Fungsi DllUnregisterServer Titik entri Fungsi DllUnregisterServer menghapus DLL sebagai handler persisten di registri. Anda membatalkan pendaftaran DLL dengan menjalankan program regsvr32.exe dengan /u bendera : regsvr32.exe /u %SystemRoot%\system32\Ifilter.dll
Fungsi DllGetClassObject Klien pengindeksan konten memanggil titik masuk Fungsi DllGetClassObject , melalui Model Objek Komponen (COM), untuk membuat objek pabrik kelas untuk antarmuka IFilter dan untuk mendapatkan penunjuk ke antarmuka pabrik kelas objek tersebut.
Fungsi DllCanUnloadNow Klien pengindeksan konten memanggil titik entri Fungsi DllCanUnloadNow , melalui COM, untuk menentukan apakah mungkin untuk membongkar DLL IFilter . Antarmuka IFilter dibongkar setelah tidak digunakan untuk interval waktu, seperti yang ditentukan oleh nilai registri FilterIdleTimeOut.

Menerapkan Kelas IFilter dan Pabrik Kelas

Setidaknya dua kelas, seperti CFilter dan CFilterCF, biasanya diimplementasikan oleh setiap DLL IFilter . Kelas CFilter menghasilkan objek antarmuka IFilter yang mengimplementasikan fungsionalitas pemfilteran konten. Fungsi anggotanya mengimplementasikan metode antarmuka antarmuka IFilter . Setiap kelas IFilter memerlukan pengidentifikasi kelas unik (CLSID), yang dihasilkan oleh implementer antarmuka IFilter .

Kelas CFilterCF menghasilkan objek pabrik kelas untuk antarmuka IFilter . Pabrik kelas dipanggil, melalui antarmuka Antarmuka IClassFactory-nya , oleh titik entri Fungsi DllGetClassObject DLL. Kelas CFilterCF membuat objek CFilter dan mengembalikan pointer ke IUnknown. Dalam kasus yang lebih kompleks, IFilter dapat menerapkan hierarki kelas sebagai pengganti kelas CFilter tunggal.

Mewarisi Antarmuka COM

Windows Search 3.0 dan yang lebih baru mengharuskan Anda menggunakan IPersistStream karena alasan berikut:

  • Untuk memastikan performa dan kompatibilitas di masa mendatang.
  • Untuk membantu meningkatkan keamanan. IFilter yang diimplementasikan dengan IPersistStream lebih aman karena konteks di mana antarmuka IFilter berjalan tidak memerlukan hak untuk membuka file pada disk atau melalui jaringan.
  • Meskipun Windows Search hanya menggunakan IPersistStream, kelas antarmuka IFilter juga dapat mewarisi implementasi antarmuka Antarmuka IPersistFile dan/atau Antarmuka IPersistStorage untuk kompatibilitas mundur.

Antarmuka ini dideklarasikan dalam file yang disertakan dari direktori mssdk\include dan memiliki pengidentifikasi antarmuka (IID) yang telah ditentukan sebelumnya. Klien pengindeksan konten meminta antarmuka IFilter melalui IUnknown untuk menentukan antarmuka mana yang akan digunakan saat memfilter konten.

Menerapkan Metode Antarmuka COM

Antarmuka IFilter mengimplementasikan metode IUnknown untuk kelas antarmuka IFilter dan pabrik kelas antarmuka IFilter . Tabel berikut mencantumkan, dalam urutan vtable, antarmuka khusus antarmuka IFilter dan metode yang harus diterapkan antarmuka IFilter . Antarmuka IFilter harus menerapkan setidaknya IPersistStream, tetapi dapat mengimplementasikan antarmuka turunan IPersist tambahan.

Antarmuka COM Metode
Antarmuka IClassFactory CreateInstance, LockServer
Antarmuka IClassFactory2 GetLicInfo, RequestLicKey, CreateInstanceLic
IFilter IFilter::Init, IFilter::GetChunk, IFilter::GetText, IFilter::GetValue, IFilter::BindRegion
Antarmuka IPersist GetClassID
Antarmuka IPersistFile IsDirty, Load, Save, SaveCompleted, GetCurFile
Antarmuka IPersistStorage IsDirty, Load, Save, GetSizeMax
IPersistStream IsDirty, Load, Save, GetSizeMax

Halaman referensi untuk setiap metode menentukan parameter dan perilaku fungsi untuk metode tersebut. Setiap halaman referensi juga memberikan kode hasil untuk diimplementasikan untuk metode tersebut. Halaman referensi untuk metode IFilter memberikan Kode khusus antarmuka dalam kode hasil FACILITY_ITF untuk diimplementasikan, dan klien pengindeksan konten juga dapat menangani salah satu kode hasil generik, seperti FACILITY_NULL dan FACILITY_WIN32. Untuk informasi selengkapnya, lihat Struktur Kode Kesalahan COM.

Metode COM yang tidak Diimplementasikan

Antarmuka IFilter harus menerapkan setidaknya IPersistStream, tetapi tidak perlu menerapkan antarmuka turunan IPersist tambahan.

Windows Search tidak perlu menerapkan metode COM yang tercantum dalam tabel berikut.

Metode yang tidak diperlukan Deskripsi
IPersistStream::IsDirty Filter harus mengembalikan E_NOTIMPL.
IPersistStream::Simpan Filter harus mengembalikan E_NOTIMPL.
IPersistStream::GetSizeMax Filter harus mengembalikan E_NOTIMPL.
IFilter::BindRegion Filter harus mengembalikan E_NOTIMPL.

Sumber Daya Tambahan

Mengembangkan Handler Filter

Memahami Handler Filter di Windows Search

Praktik Terbaik untuk Membuat Penangan Filter di Windows Search

Mengembalikan Properti dari Penangan Filter

Filter Handler yang Dikirim dengan Windows

Mendaftarkan Penangan Filter

Menguji Handler Filter