In questo argomento viene illustrato come creare e registrare gestori di proprietà per l'uso con il sistema di proprietà Di Windows.
Questo argomento è organizzato come segue:
Procedure consigliate
Override delle proprietà del file system
Alcune proprietà per i file vengono fornite dall'origine dati del file system, ad esempio:
- PKEY_FileName
- PKEY_Extension
- PKEY_ModifiedTime
In generale, i gestori delle proprietà non possono fornire valori per queste proprietà. Tuttavia, in alcuni casi queste proprietà possono essere sostituite in base alle informazioni di registrazione fornite dal gestore delle proprietà. I gestori delle proprietà popolano HKEY_CLASSES_ROOT\CLSID{clsid\}\OverrideFileSystemProperties con i nomi delle proprietà che vogliono eseguire l'override. Ciò è limitato a un set fisso di proprietà visualizzate nell'elenco seguente di cui il sistema ha conoscenza.
L'override è supportata per i valori delle proprietà seguenti:
- System.Kind
- System.FileName
- System.IsPinnedToNameSpaceTree
- System.ItemNameDisplay
- System.SFGAOFlags
- System.ItemPathDisplay
- System.ItemPathDisplayNarrow
- System.ItemFolderNameDisplay
- System.ItemFolderPathDisplay
- System.ItemFolderPathDisplayNarrow
Per un elenco completo di tutte le proprietà di Shell, vedere Proprietà della shell.
Importante
I valori delle proprietà sottoposti a override vengono usati solo quando i file vengono indicizzati. Pertanto, l'esplorazione dei file dall'origine dati del file system non rivela i valori sottoposti a override.
Archiviazione delle proprietà nei formati di file basati su XML
Sono disponibili due opzioni di base per archiviare le proprietà nei formati di file basati su XML:
- Archiviare ogni proprietà usando elementi XML e attributi in base allo schema XML del documento. Questo approccio è più "xml friendly".
- Serializzare l'intero archivio proprietà in un oggetto BLOB (Binary Large Object), convertire il BLOB in una stringa con codifica base64 e quindi archiviare tale stringa nel codice XML. Ciò è più semplice dei due approcci e può essere usato per fornire in modo semplice il supporto per i metadati aperti.
Alcuni gestori possono combinare questi approcci, archiviando alcuni valori importanti in formato XML standard e archiviando il resto in un BLOB, ad esempio.
Proprietà calcolate
Alcune proprietà sono derivate da attributi specifici di un file. Ad esempio, la proprietà System.Image.Dimension è determinata dalle dimensioni effettive dell'immagine in un file di immagine. Poiché tali valori di proprietà non possono essere modificati dal gestore delle proprietà, vengono contrassegnati isInnate="true"
nella descrizione della proprietà. Altre proprietà vengono calcolate da una parte di una proprietà specifica o aggregando i valori di più proprietà. Poiché gli aggiornamenti a queste proprietà "calcolate" creano ambiguità in base alla modalità di modifica dei valori di "origine", le proprietà calcolate devono essere contrassegnate isInnate="true"
nella descrizione della proprietà o segnalate come di sola lettura. Quest'ultima opzione è disponibile indicando al gestore di restituire S_FALSE da IPropertyStoreCapabilities::IsPropertyWritable.
Domande frequenti
Perché il gestore delle proprietà non viene caricato dall'indicizzatore di Windows Search?
L'indicizzatore di Windows Search viene eseguito come servizio di sistema e non può caricare le DLL archiviate nella directory del profilo utente. Se si sta creando e eseguendo il debug usando Microsoft Visual Studio, la DLL verrà inserita nel profilo utente e pertanto non verrà caricata dall'indicizzatore. Per risolvere questo problema, copiare la DLL all'esterno della cartella del profilo,ad esempio in C:\Programmi\YourAppName) e registrarla.
Per indicazioni più specifiche sullo sviluppo di gestori delle proprietà per l'uso con l'indicizzatore di Windows Search, vedere Sviluppo di gestori di proprietà per Windows Search.
Quali proprietà devono essere individuabili tramite i metodi di enumerazione 'IPropertyStore::GetCount' e 'IPropertyStore::GetAt'?
Non tutti i client degli oggetti dell'archivio delle proprietà usano questi metodi. Alcuni client sono consapevoli delle proprietà che pianificano di richiedere direttamente (in base al nome PKEY) o ricevere informazioni sulle proprietà tramite un elenco di descrizioni delle proprietà. I metodi di individuazione delle proprietà suppongono diversi altri scenari. Se una proprietà non deve partecipare a questi scenari, non è necessario enumerare. Di conseguenza, un gestore delle proprietà può produrre un valore non VT_EMPTY per le proprietà non individuate tramite i metodi IPropertyStore::GetCount e IPropertyStore::GetAt.
Tuttavia, le proprietà devono essere visibili tramite questi metodi se vengono soddisfatte una delle condizioni seguenti:
-
Se la proprietà è indicizzata in modo che sia ricercabile: Ciò significa che è incluso nell'archivio delle proprietà di Windows Search (denotato dallo
isColumn = "true"
schema della descrizione delle proprietà) o disponibile per le ricerche full-text (inInvertedIndex = "true"
). In assenza di questi flag o l'assenza di una descrizione della proprietà, le proprietà del tipo "string" verranno aggiunte automaticamente all'indice invertito per abilitare la ricerca. Poiché l'elenco delle proprietà note (quelle con descrizioni delle proprietà installate) nel sistema delle proprietà è molto grande (più di 800 proprietà), sarebbe impraticabile chiedere a ogni gestore delle proprietà registrate nel sistema delle proprietà. Il processo di indicizzazione enumera invece le proprietà pertinenti dal gestore delle proprietà per ogni elemento indicizzato e usa i valori delle proprietà enumerate per compilare l'indice full-text. - Se la proprietà deve essere copiata quando il set di proprietà dell'elemento è duplicato: Per implementare una funzione "copia un set di proprietà", l'elemento di origine rende visibili le proprietà che devono essere copiate tramite i metodi IPropertyStore::GetCount e IPropertyStore::GetAt . Le proprietà che non devono essere copiate o non devono essere copiate non devono essere incluse.
- Se il valore della proprietà non è vuoto (VT_EMPTY): I valori delle proprietà vuoti non sono utili per i client. Quando i client tentano di restituire valori di proprietà vuoti, viene restituito un valore di VT_EMPTY. Pertanto, le proprietà con valori vuoti non devono essere enumerate.
- Se la proprietà deve essere rimossa quando si richiama la funzione "remove properties": Questa funzionalità esiste per proteggere la privacy; individua tutti i valori del gestore delle proprietà tramite l'enumerazione e rimuove ogni valore selezionato per la rimozione dall'utente.
Nota
L'enumerazione delle proprietà non comunica il set di proprietà supportate da un gestore di proprietà specifico se il gestore supporta uno schema fisso (e non i metadati aperti). Tali gestori devono invece documentare il set di proprietà supportate.
Ricerca per categorie sapere quali formati di file supportano metadati aperti?
Per informazioni sul supporto per i metadati aperti, vedere "Tipi di file che supportano metadati aperti" in Tipi di file.
È possibile archiviare VT_NULL valori usando un gestore delle proprietà?
No. VT_NULL valori verranno convertiti in VT_EMPTY nelle chiamate a IPropertyStore::GetValue e IPropertyStore::SetValue.
Quali formati di stringa di data sono supportati dalla funzione 'PropVariantChangeType'?
In genere, le proprietà che rappresentano valori di data/ora devono essere rappresentati usando VT_FILETIME. Tuttavia, molte origini dati forniscono queste informazioni nel formato stringa. L'API helper PropVariantChangeType supporta la coercing di alcuni formati di data stringa nei valori FILETIME , come illustrato nella tabella seguente.
Formato | Windows Vista, Windows XP e Microsoft Windows Desktop Search (WDS) | Windows 7 | Note |
---|---|---|---|
aaaa/mm/dd:hh:mm:ss.uuu | Sì | Sì | UTC; y=year, m=month, d=date, h=hours (24 ore), m=minutes, s=secondi, u=microsecondi |
aa-mm-ddThh:mm:ssZ | No | Sì |
Specifica del formato ISO8601 UTC (denotato dall'indicatore del fuso orario 'Z'); y=year, m=month, d=date, h=hours (24 ore), m=minutes, s=secondi; 'T' è un delimitatore per la parte temporale. |
È possibile creare un gestore di proprietà di sola lettura?
Sì. Alcune implementazioni del gestore delle proprietà non supportano la scrittura di valori delle proprietà. Questi gestori di proprietà devono restituire STGM_E_ACCESSDENIED nelle chiamate a IInitializeXXX::Initialize che passano STGM_READWRITE o in qualsiasi chiamata a IPropertyStore::SetValue.
Tutti i gestori delle proprietà aperti in modalità STGM_READ devono restituire STGM_E_ACCESSDENIED nelle chiamate a IPropertyStore::SetValue.
Un gestore di proprietà può trattare una proprietà come di sola lettura, anche se lo schema indica che la proprietà è scrivibile?
Sì. Nel sistema dello schema le proprietà vengono annotate come di sola lettura (incluse quelle con isInnate = "true"
) o di lettura/scrittura. I gestori di proprietà che non supportano la scrittura di una particolare proprietà che indica che lo schema deve essere scrivibile deve implementare IPropertyStoreCapabilities e restituire S_FALSE alle chiamate a IPropertyStoreCapabilities::IsPropertyWritable per tale proprietà. Ciò indica che nel contesto di questo gestore e di questo file la proprietà non è scrivibile.
Nota
L'azione inversa non è possibile. Non è possibile abilitare un gestore di proprietà per scrivere una proprietà contrassegnata come di sola lettura nello schema