Menerapkan Handler Protokol untuk WDS
Catatan
Windows Desktop Search 2.x adalah teknologi usang yang awalnya tersedia sebagai add-in untuk Windows XP dan Windows Server 2003. Pada rilis selanjutnya, gunakan Windows Search sebagai gantinya.
Membuat handler protokol melibatkan penerapan ISearchProtocol untuk mengelola objek UrlAccessor, IUrlAccessor untuk menghasilkan metadata tentang dan untuk mengidentifikasi filter yang sesuai untuk item di penyimpanan data, IProtocolHandlerSite untuk membuat instans objek SearchProtocol dan mengidentifikasi filter yang sesuai, dan IFilteruntuk memfilter file kepemilikan atau untuk menghitung dan memfilter file yang disimpan secara hierarkis. Penangan protokol harus multithreaded.
Bagian ini berisi topik berikut:
- Catatan tentang URL
- Antarmuka Handler Protokol
- IFilter untuk Kontainer
- Menambahkan Fungsionalitas Opsi Handler Protokol
- Topik terkait
Catatan tentang URL
Microsoft Windows Desktop Search (WDS) menggunakan URL untuk mengidentifikasi item secara unik dalam sistem file, di dalam penyimpanan seperti database, atau di Web. URL yang mendefinisikan simpul entri disebut halaman mulai; WDS dimulai pada halaman mulai tersebut dan secara rekursif merayapi penyimpanan data. Struktur URL yang khas adalah:
protocol://host/path/name.extension
Catatan
Saat ingin menambahkan penyimpanan data baru, Anda harus memilih nama untuk mengidentifikasinya yang tidak berkonflik dengan yang saat ini. Kami merekomendasikan konvensi penamaan ini: companyName.scheme.
Antarmuka Handler Protokol
ISearchProtocol
Antarmuka ISearchProtocol memanggil, menginisialisasi, dan mengelola objek UrlAccessor. Untuk informasi selengkapnya tentang menerapkan antarmuka ISearchProtocol, lihat referensi Antarmuka ISearchProtocol.
IUrlAccessor
Untuk URL tertentu, antarmuka IUrlAccessor menghasilkan metadata tentang struktur lokasi serta item yang terkandung, dan mengikat item tersebut ke filter. Objek IUrlAccessor dibuat dan diinisialisasi oleh objek SearchProtocol; namun, Anda juga dapat menerapkan metode inisialisasi internal sehingga objek IUrlAccessor Anda dapat melakukan tugas inisialisasi khusus untuk handler protokol Anda, seperti memvalidasi URL untuk item yang diakses atau memeriksa waktu terakhir yang dimodifikasi untuk menentukan apakah file harus diproses dalam perayapan saat ini.
Catatan
Waktu yang dimodifikasi untuk direktori diabaikan. Objek IUrlAccessor harus menghitung objek turunan untuk menentukan apakah ada modifikasi atau penghapusan.
Sebagian besar desain objek UrlAccessor tergantung pada apakah strukturnya hierarkis atau berbasis tautan. Untuk penyimpanan data hierarkis, objek UrlAccessor harus menemukan filter yang dapat menghitung kontennya. Perbedaan lain antara penangan protokol berbasis hierarkis dan tautan adalah penggunaan metode IsDirectory. Dalam penangan protokol berbasis tautan, metode ini harus mengembalikan S_FALSE. Penangan protokol hierarkis harus mengembalikan S_OK untuk kontainer.
Untuk instruksi lebih lanjut tentang menerapkan antarmuka IUrlAccessor , lihat referensi Antarmuka IUrlAccessor .
IProtocolHandlerSite
Antarmuka ini digunakan untuk membuat instans objek SearchProtocol dan juga menyediakan objek UrlAccessor dengan filter yang sesuai untuk ID kelas tertentu (CLSID).
IFilter untuk Kontainer
Jika Anda menerapkan penangan protokol hierarkis, Anda harus menerapkan komponen IFilterkontainer yang menghitung URL yang mewakili kontainer atau folder. Proses enumerasi adalah perulangan melalui metode GetChunk dan GetValue antarmuka IFilter yang mengembalikan daftar URL yang mewakili setiap item dalam kontainer.
Pertama, GetChunk mengembalikan FULLPROSPEC dengan properti yang ditetapkan GATHER_PROPSET dan:
- PID_GTHR_DIRLINK, URL ke item tanpa waktu terakhir diubah, atau
- PID_GTHR_DIRLINK_WITH_TIME, URL bersama dengan waktu terakhir diubah
Properti yang ditetapkan GUID untuk GATHER_PROPSET adalah 0B63E343-9CCC-11D0-BCDB-00805FCCCE04. Properti PROPSPEC PID_GTHR_DIRLINK=2 atau PID_GTHR_DIRLINK_WITH_TIME = 12 desimal.
Mengembalikan PID_GTHR_DIRLINK_WITH_TIME lebih efisien karena pengindeks dapat segera menentukan apakah item perlu diindeks tanpa memanggil metode ISearchProtocol-CreateUrlAccessor>() dan IUrlAccessor-GetLastModified>().
Kemudian GetValue mengembalikan PROPVARIANT untuk URL (dan waktu terakhir diubah jika digunakan), sebagai:
- VT_LPWSTR, URL item anak, atau
- Vektor URL diikuti oleh FILETIME
Contoh kode berikut menunjukkan cara membangun PID_GTHR_DIRLINK_WITH_TIME yang tepat.
Catatan
KODE DAN INFORMASI INI DIBERIKAN "APA ADANYA" TANPA JAMINAN DALAM BENTUK APA PUN, BAIK TERSURAT MAUPUN TERSIRAT, TERMASUK NAMUN TIDAK TERBATAS PADA JAMINAN TERSIRAT ATAS KELAYAKAN UNTUK DIPERDAGANGKAN DAN/ATAU KESESUAIAN UNTUK TUJUAN TERTENTU.
Hak Cipta (C) Microsoft. Hak cipta dilindungi undang-undang.
// 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;
}
Catatan
Komponen IFilterkontainer harus selalu menghitung semua URL anak meskipun URL anak tidak berubah, karena Pengindeks mendeteksi penghapusan melalui proses enumerasi. Jika output tanggal dalam DIR_LINKS_WITH_TIME menunjukkan bahwa data tidak berubah, pengindeks tidak memperbarui data untuk URL tersebut.
URL fisik adalah URL yang diproses objek UrlAccessor . Jika filter tidak memancarkan DisplayUrl yang mudah digunakan, WDS menampilkan URL fisik kepada pengguna sebagai bagian dari hasil pencarian. Skema WDS berisi dua properti untuk mengontrol apa yang ditampilkan kepada pengguna akhir, seperti yang ditunjukkan pada tabel di bawah ini.
GUID | PROPSPEC | Deskripsi |
---|---|---|
D5CDD505-2E9C-101B-9397-08002B2cF9AE | DisplayFolder | Jalur Folder ditampilkan kepada pengguna dalam hasil pencarian |
D5CDD505-2E9C-101B-9397-08002B2cF9AE | Nama Folder | Nama tampilan folder induk |
Jika kode Anda tidak memancarkan DisplayFolder atau FolderName, nilai-nilai ini dihitung dari DisplayUrl. Teruskan garis miring dalam URL menunjukkan kontainer dalam penyimpanan atau sistem file.
Menambahkan Fungsionalitas Opsi Handler Protokol
Agar handler protokol Anda memiliki halaman mulai default (dan URL node entri), Anda harus menerapkan antarmuka ISearchProtocolOptions . Dalam versi WDS yang akan datang, antarmuka ini akan menyediakan kait ke dialog Opsi untuk pengalaman pengguna yang ditingkatkan. Antarmuka ini menyediakan fungsionalitas berikut:
- Menentukan apakah persyaratan untuk penangan protokol Anda terpenuhi. Misalnya, penyimpanan handler protokol Anda mungkin memerlukan akses ke aplikasi tertentu untuk mengindeks data aplikasi dengan benar tetapi aplikasi tersebut tidak tersedia.
- Mengidentifikasi persyaratan minimum yang diperlukan penangan protokol Anda untuk memproses item. Persyaratan dapat diekspresikan dalam deskripsi yang mudah digunakan dan dilokalkan, seperti "Microsoft Outlook 2000 atau lebih tinggi."
- Menentukan URL yang harus diproses oleh penangan protokol Anda secara default.
ISearchProtocolOptions
Tabel berikut menjelaskan metode yang perlu Anda terapkan untuk antarmuka ISearchProtocolOptions .
Metode | Deskripsi |
---|---|
CheckRequirements | Menentukan apakah persyaratan minimum penangan protokol kustom terpenuhi |
GetDefaultCrawlScope | Mengembalikan daftar URL default dalam penyimpanan tertentu untuk penangan protokol kustom |
GetRequirements | Mengidentifikasi deskripsi persyaratan minimum yang mudah digunakan dan dilokalkan untuk penangan protokol kustom |
Topik terkait