Meilleures pratiques et FAQ sur le gestionnaire de propriétés

Cette rubrique explique comment créer et inscrire des gestionnaires de propriétés pour fonctionner avec le système de propriétés Windows.

Cette rubrique est organisée comme suit :

Bonnes pratiques

Remplacement des propriétés du système de fichiers

Certaines propriétés des fichiers sont fournies par la source de données du système de fichiers, telles que :

  • PKEY_FileName
  • PKEY_Extension
  • PKEY_ModifiedTime

En général, les gestionnaires de propriétés ne peuvent pas fournir de valeurs pour ces propriétés. Toutefois, dans certains cas, ces propriétés peuvent être remplacées en fonction des informations d’inscription fournies par le gestionnaire de propriétés. Les gestionnaires de propriétés remplissent HKEY_CLASSES_ROOT\CLSID\{handler clsid}\OverrideFileSystemProperties avec les noms des propriétés qu’ils souhaitent remplacer. Cela est limité à un ensemble fixe de propriétés affichées dans la liste suivante dont le système a connaissance.

La substitution est prise en charge pour les valeurs de propriété suivantes :

Pour obtenir la liste complète de toutes les propriétés de l’interpréteur de commandes, consultez Propriétés de l’interpréteur de commandes.

Important

Les valeurs de propriété remplacées sont utilisées uniquement lorsque les fichiers sont indexés. Ainsi, la navigation dans les fichiers à partir de la source de données du système de fichiers ne révèle pas les valeurs remplacées.  

Stockage des propriétés dans des formats de fichier XML

Deux options de base sont disponibles pour stocker les propriétés dans des formats de fichiers XML :

  • Stockez chaque propriété à l’aide d’éléments et d’attributs XML en fonction du schéma XML du document. Cette approche est plus « compatible XML ».
  • Sérialisez l’intégralité du magasin de propriétés dans un objet BLOB (Blob) en mémoire, convertissez l’objet BLOB en une chaîne encodée en base64, puis stockez cette chaîne dans le code XML. Il s’agit de la plus simple des deux approches et peut être utilisée pour fournir une prise en charge triviale des métadonnées ouvertes.

Certains gestionnaires peuvent combiner ces approches, en stockant certaines valeurs importantes au format XML standard et en stockant le reste dans un objet BLOB, par exemple.

Propriétés calculées

Certaines propriétés sont dérivées d’attributs spécifiques d’un fichier. Par exemple, la propriété System.Image.Dimensions est déterminée par les dimensions réelles de l’image dans un fichier image. Étant donné que ces valeurs de propriété ne peuvent pas être modifiées par le gestionnaire de propriétés, elles sont donc marquées isInnate="true" dans la description de la propriété. D’autres propriétés sont calculées à partir d’une partie d’une propriété spécifique ou en agrégeant les valeurs de plusieurs propriétés. Étant donné que les mises à jour de ces propriétés « calculées » créeraient une ambiguïté quant à la façon dont les valeurs « source » doivent être modifiées, les propriétés calculées doivent être marquées isInnate="true" dans la description de la propriété ou signalées comme en lecture seule. Cette dernière option est disponible en demandant au gestionnaire de retourner S_FALSE à partir de IPropertyStoreCapabilities::IsPropertyWritable.

Forum Aux Questions (FAQ)

Pourquoi mon gestionnaire de propriétés n’est-il pas chargé par l’indexeur Recherche Windows ?

L’indexeur Recherche Windows s’exécute en tant que service système et ne peut pas charger les DLL stockées dans le répertoire de profil utilisateur. Si vous générez et déboguez à l’aide de Microsoft Visual Studio, il placera la DLL dans votre profil utilisateur (et par conséquent, elle ne sera pas chargée par l’indexeur). Pour contourner ce problème, copiez votre DLL en dehors de votre dossier de profil (par exemple, dans C:\Program Files\YourAppName) et inscrivez-la.

Pour obtenir des conseils plus spécifiques sur le développement de gestionnaires de propriétés à utiliser avec l’indexeur Recherche Windows, consultez Développement de gestionnaires de propriétés pour Windows Search.

Quelles propriétés doivent être découvertes par le biais des méthodes d’énumération « IPropertyStore::GetCount » et « IPropertyStore::GetAt » ?

Tous les clients des objets de magasin de propriétés n’utilisent pas ces méthodes. Certains clients connaissent les propriétés qu’ils envisagent de demander directement (par nom PKEY) ou reçoivent des informations sur les propriétés via une liste de description des propriétés. Les méthodes de découverte de propriétés suppportent plusieurs autres scénarios. Si une propriété n’a pas besoin de participer à ces scénarios, elle n’a pas besoin d’être énumérée. Par conséquent, un gestionnaire de propriétés peut produire une valeur non VT_EMPTY pour les propriétés qui ne sont pas découvertes via les méthodes IPropertyStore::GetCount et IPropertyStore::GetAt .

Toutefois, les propriétés doivent être visibles via ces méthodes si l’une des conditions suivantes est remplie :

  • Si la propriété est indexée afin qu’elle puisse faire l’objet d’une recherche : Cela signifie qu’il est inclus dans le magasin de propriétés Recherche Windows (indiqué par isColumn = "true" dans le schéma de description de propriété) ou disponible pour les recherches en texte intégral (inInvertedIndex = "true"). En l’absence de ces indicateurs ou de l’absence d’une description de propriété, les propriétés de type « string » seront ajoutées automatiquement à l’index inversé pour permettre la recherche. Étant donné que la liste des propriétés connues (celles avec des descriptions de propriétés installées) dans le système de propriétés est très volumineuse (plus de 800 propriétés), il serait peu pratique de demander à chaque gestionnaire de propriétés pour chaque propriété inscrite dans le système de propriétés. Au lieu de cela, le processus d’indexation énumère les propriétés pertinentes du gestionnaire de propriétés pour chaque élément qu’il indexe, et il utilise les valeurs des propriétés énumérées pour générer l’index de texte intégral.
  • Si la propriété doit être copiée lorsque le jeu de propriétés de l’élément est dupliqué : Pour implémenter une fonction « copier un jeu de propriétés », l’élément source rend les propriétés qui doivent être copiées visibles via les méthodes IPropertyStore::GetCount et IPropertyStore::GetAt . Les propriétés qui n’ont pas besoin d’être copiées ou qui n’ont pas de sens d’être copiées ne doivent pas être incluses.
  • Si la valeur de la propriété n’est pas vide (VT_EMPTY) : Les valeurs de propriété vides ne sont pas utiles pour les clients. Lorsque les clients tentent de retourner des valeurs de propriété vides, une valeur de VT_EMPTY est retournée. Par conséquent, les propriétés avec des valeurs vides ne doivent pas être énumérées.
  • Si la propriété doit être supprimée lors de l’appel de la fonction « remove properties » : Cette fonctionnalité existe pour protéger la confidentialité ; il détecte toutes les valeurs du gestionnaire de propriétés via l’énumération et supprime chacune d’elles sélectionnées pour suppression par l’utilisateur.

Notes

L’énumération des propriétés ne communique pas l’ensemble de propriétés pris en charge par un gestionnaire de propriétés particulier si le gestionnaire prend en charge un schéma fixe (et non des métadonnées ouvertes). Au lieu de cela, ces gestionnaires doivent documenter l’ensemble de propriétés qu’ils prennent en charge.

 

Comment faire savoir quels formats de fichiers prennent en charge les métadonnées ouvertes ?

Pour plus d’informations sur la prise en charge des métadonnées ouvertes, consultez « Types de fichiers qui prennent en charge les métadonnées ouvertes » dans Types de fichiers.

Les valeurs VT_NULL peuvent-elles être stockées à l’aide d’un gestionnaire de propriétés ?

Non. VT_NULL valeurs seront converties en VT_EMPTY lors des appels à IPropertyStore::GetValue et IPropertyStore::SetValue.

Quels formats de chaîne de dates sont pris en charge par la fonction « PropVariantChangeType » ?

En règle générale, les propriétés qui représentent des valeurs de date/heure doivent être représentées à l’aide de VT_FILETIME. Toutefois, de nombreuses sources de données fournissent ces informations sous forme de chaîne. L’API d’assistance PropVariantChangeType prend en charge le coercing de certains formats de date de chaîne dans des valeurs FILETIME , comme indiqué dans le tableau suivant.

Format Windows Vista, Windows XP et Microsoft Windows Desktop Search (WDS) Windows 7 Notes
aaaa/mm/jj:hh:mm:ss.uuu Oui Oui UTC; y=year, m=month, d=date, h=hours (horloge de 24 heures), m=minutes, s=secondes, u=microsecondes
aaaa-mm-ddThh:mm:ssZ Non Oui Spécification du format ISO8601 UTC (indiqué par l’indicateur de fuseau horaire « Z ») ; y=year, m=month, d=date, h=hours (horloge de 24 heures), m=minutes, s=secondes; 'T' est un délimiteur pour la partie de temps.

Est-il possible de créer un gestionnaire de propriétés en lecture seule ?

Oui. Certaines implémentations de gestionnaires de propriétés ne prennent pas en charge l’écriture de valeurs de propriété. Ces gestionnaires de propriétés doivent retourner STGM_E_ACCESSDENIED lors des appels à IInitializeXXX::Initialize qui passent STGM_READWRITE, ou sur n’importe quel appel à IPropertyStore::SetValue.

Tous les gestionnaires de propriétés ouverts en mode STGM_READ doivent retourner STGM_E_ACCESSDENIED lors des appels à IPropertyStore::SetValue.

Un gestionnaire de propriétés peut-il traiter une propriété en lecture seule, même si le schéma indique que la propriété peut être en écriture ?

Oui. Dans le système de schéma, les propriétés sont annotées en lecture seule (y compris celles avec isInnate = "true") ou en lecture/écriture. Les gestionnaires de propriétés qui ne prennent pas en charge l’écriture d’une propriété particulière qui, selon le schéma, doit être accessible en écriture doivent implémenter IPropertyStoreCapabilities et retourner S_FALSE lors des appels à IPropertyStoreCapabilities::IsPropertyWritable pour cette propriété. Cela indique que dans le contexte de ce gestionnaire et de ce fichier, la propriété n’est pas accessible en écriture.

Notes

L’action inverse n’est pas possible. Vous ne pouvez pas activer un gestionnaire de propriétés pour écrire une propriété marquée comme en lecture seule dans le schéma