Praktik Dan FAQ Terbaik Handler Properti

Topik ini menjelaskan cara membuat dan mendaftarkan penangan properti untuk bekerja dengan sistem properti Windows.

Topik ini diatur sebagai berikut:

Praktik Terbaik

Mengesampingkan Properti Sistem File

Beberapa properti untuk file disediakan oleh sumber data sistem file, seperti:

  • PKEY_FileName
  • PKEY_Extension
  • PKEY_ModifiedTime

Secara umum, penangan properti tidak dapat menyediakan nilai untuk properti ini. Namun, dalam beberapa kasus, properti ini dapat ditimpa berdasarkan informasi pendaftaran yang disediakan oleh handler properti. Handler properti mengisi HKEY_CLASSES_ROOT\CLSID\{handler clsid}\OverrideFileSystemProperties dengan nama properti yang ingin mereka ambil alih. Ini terbatas pada sekumpulan properti tetap yang ditunjukkan dalam daftar berikut yang memiliki pengetahuan sistem.

Penimpaan didukung untuk nilai properti berikut:

Untuk daftar lengkap semua properti Shell, lihat Properti Shell.

Penting

Nilai properti yang ditimpa hanya digunakan saat file diindeks. Dengan demikian, menelusuri file dari sumber data sistem file tidak mengungkapkan nilai yang ditimpa.  

Menyimpan Properti dalam Format File berbasis XML

Ada dua opsi dasar yang tersedia untuk menyimpan properti dalam format file berbasis XML:

  • Simpan setiap properti menggunakan elemen dan atribut XML sesuai dengan skema XML dokumen. Pendekatan ini lebih "ramah XML".
  • Menserialisasikan seluruh penyimpanan properti menjadi objek besar Biner (BLOB) memori, mengonversi BLOB menjadi string yang dikodekan base64, lalu menyimpan string tersebut di XML. Ini adalah yang lebih sederhana dari dua pendekatan dan dapat digunakan untuk sepele memberikan dukungan untuk metadata terbuka.

Beberapa handler mungkin menggabungkan pendekatan ini, menyimpan beberapa nilai penting dalam format XML standar dan menyimpan sisanya dalam BLOB, misalnya.

Properti Komputasi

Beberapa properti berasal dari atribut file tertentu. Misalnya, properti System.Image.Dimensions ditentukan oleh dimensi gambar yang sebenarnya dalam file gambar. Karena nilai properti tersebut tidak dapat diubah oleh handler properti, nilai properti tersebut dengan demikian ditandai isInnate="true" dalam deskripsi properti. Properti lain dihitung dari bagian properti tertentu atau dengan menggabungkan nilai beberapa properti. Karena pembaruan pada properti "komputasi" ini akan menciptakan ambiguitas tentang bagaimana nilai "sumber" harus diubah, properti komputasi harus ditandai isInnate="true" dalam deskripsi properti atau dilaporkan sebagai baca-saja. Opsi terakhir tersedia dengan menginstruksikan handler untuk mengembalikan S_FALSE dari IPropertyStoreCapabilities::IsPropertyWritable.

Pertanyaan Umum

Mengapa handler properti saya tidak dimuat oleh pengindeks Windows Search?

Pengindeks Windows Search berjalan sebagai layanan sistem dan tidak dapat memuat DLL yang disimpan di direktori profil pengguna. Jika Anda membangun dan menelusuri kesalahan menggunakan Microsoft Visual Studio, itu akan menempatkan DLL di profil pengguna Anda (dan karena itu tidak akan dimuat oleh pengindeks). Untuk mengatasi hal ini, salin DLL Anda di luar folder profil Anda (misalnya, ke C:\Program Files\YourAppName) dan daftarkan di sana.

Untuk panduan lebih spesifik tentang mengembangkan handler properti untuk bekerja dengan pengindeks Windows Search, lihat Mengembangkan Penangan Properti untuk Windows Search.

Properti mana yang harus dapat ditemukan melalui metode enumerasi 'IPropertyStore::GetCount' dan 'IPropertyStore::GetAt'?

Tidak semua klien objek penyimpanan properti menggunakan metode ini. Beberapa klien mengetahui properti yang mereka rencanakan untuk meminta secara langsung (berdasarkan nama PKEY), atau menerima informasi properti melalui daftar deskripsi properti. Metode penemuan properti mendukung beberapa skenario lainnya. Jika properti tidak perlu berpartisipasi dalam skenario ini, properti tidak perlu dijumlahkan. Oleh karena itu, handler properti dapat menghasilkan nilai non-VT_EMPTY untuk properti yang tidak ditemukan melalui metode IPropertyStore::GetCount dan IPropertyStore::GetAt .

Namun, properti harus terlihat melalui metode ini jika salah satu kondisi berikut terpenuhi:

  • Jika properti diindeks sehingga dapat dicari: Ini berarti disertakan dalam penyimpanan properti Pencarian Windows (ditandai dengan isColumn = "true" dalam skema deskripsi properti) atau tersedia untuk pencarian teks lengkap (inInvertedIndex = "true"). Dengan tidak adanya bendera ini atau tidak adanya deskripsi properti, properti jenis "string" akan ditambahkan secara otomatis ke indeks terbalik untuk mengaktifkan pencarian. Karena daftar properti yang diketahui (yang memiliki deskripsi properti yang diinstal) dalam sistem properti sangat besar (lebih dari 800 properti), tidak praktis untuk meminta setiap penangan properti untuk setiap properti yang terdaftar dalam sistem properti. Sebagai gantinya, proses pengindeksan menghitung properti yang relevan dari handler properti untuk setiap item yang diindeksnya, dan menggunakan nilai properti enumerasi untuk membangun indeks teks lengkap.
  • Jika properti harus disalin saat kumpulan properti item diduplikasi: Untuk menerapkan fungsi "salin set properti", item sumber membuat properti yang harus disalin terlihat melalui metode IPropertyStore::GetCount dan IPropertyStore::GetAt . Properti yang tidak perlu disalin atau tidak masuk akal disalin tidak boleh disertakan.
  • Jika nilai properti tidak kosong (VT_EMPTY): Nilai properti yang kosong tidak berguna untuk klien. Ketika klien mencoba mengembalikan nilai properti kosong, nilai VT_EMPTY dikembalikan. Dengan demikian, properti dengan nilai kosong tidak boleh dijumlahkan.
  • Jika properti harus dihapus saat memanggil fungsi "hapus properti": Fitur ini ada untuk melindungi privasi; ini menemukan semua nilai dari handler properti melalui enumerasi dan menghapus masing-masing yang dipilih untuk dihapus oleh pengguna.

Catatan

Menghitung properti tidak mengkomunikasikan kumpulan properti yang didukung oleh handler properti tertentu jika handler mendukung skema tetap (dan bukan metadata terbuka). Sebaliknya, handler tersebut harus mendokumentasikan sekumpulan properti yang didukungnya.

 

Bagaimana cara mengetahui format file mana yang mendukung metadata terbuka?

Untuk informasi tentang dukungan untuk metadata terbuka, lihat "Jenis File yang Mendukung Metadata Terbuka" di Jenis File.

Bisakah nilai VT_NULL disimpan menggunakan handler properti?

Nomor. nilai VT_NULL akan dikonversi ke VT_EMPTY pada panggilan ke IPropertyStore::GetValue dan IPropertyStore::SetValue.

Format string tanggal mana yang didukung oleh fungsi 'PropVariantChangeType'?

Umumnya, properti yang mewakili nilai tanggal/waktu harus diwakili menggunakan VT_FILETIME. Namun, banyak sumber data memberikan informasi ini dalam bentuk string. API pembantu PropVariantChangeType mendukung pemaksaan beberapa format tanggal string ke dalam nilai FILETIME , seperti yang ditunjukkan dalam tabel berikut.

Format Windows Vista, Windows XP, dan Microsoft Windows Desktop Search (WDS) Windows 7 Catatan
yyyy/mm/dd:hh:mm:ss.uuu Ya Ya UTC; y=year, m=month, d=date, h=hours (jam 24 jam), m=minutes, s=seconds, u=microseconds
yyyy-mm-ddThh:mm:ssZ Tidak Ya Spesifikasi format ISO8601 UTC (ditandai dengan indikator zona waktu 'Z'); y=tahun, m=bulan, d=tanggal, h=jam (jam 24 jam), m=menit, s=detik; 'T' adalah pemisah untuk bagian waktu.

Apakah mungkin untuk membuat handler properti baca-saja?

Ya. Beberapa implementasi handler properti tidak mendukung penulisan nilai properti. Handler properti ini harus mengembalikan STGM_E_ACCESSDENIED pada panggilan ke IInitializeXXX::Initialize yang lulus STGM_READWRITE, atau pada panggilan apa pun ke IPropertyStore::SetValue.

Semua handler properti yang dibuka dalam mode STGM_READ harus mengembalikan STGM_E_ACCESSDENIED pada panggilan ke IPropertyStore::SetValue.

Dapatkah handler properti memperlakukan properti sebagai baca-saja, bahkan jika skema menunjukkan bahwa properti dapat ditulis?

Ya. Dalam sistem skema, properti diannotasi sebagai baca-saja (termasuk yang dengan isInnate = "true") atau baca/tulis. Handler properti yang tidak mendukung penulisan properti tertentu yang dikatakan skema harus dapat ditulis harus mengimplementasikan IPropertyStoreCapabilities dan mengembalikan S_FALSE pada panggilan ke IPropertyStoreCapabilities::IsPropertyWritable untuk properti tersebut. Ini menunjukkan bahwa dalam konteks handler ini dan file ini, properti tidak dapat ditulis.

Catatan

Tindakan terbalik tidak dimungkinkan. Anda tidak dapat mengaktifkan penangan properti untuk menulis properti yang ditandai sebagai baca-saja dalam skema