2010-10-11 4 views
6

J'écris une application qui utilise Uniform Type Identifiers. Plus précisément, j'appelle UTTypeCreateAllIdentifiersForTag() et je lui passe divers types MIME. Mon espoir était que cette fonction (distincte de UTTypeCreatePreferredIdentifierForTag()) me donnerait l'UTI plus spécifique ainsi que toutes les IU auxquelles il se conforme. Cela ne semble pas être le cas - il retourne une seule infection urinaire, ou les infections urinaires secondaires sont fausses.Étant donné un UTI (Uniform Type Identifier), trouver tous les types auxquels il se conforme

Il ya la fonction UTTypeConformsTo() définie dans le même fichier d'en-tête, mais je préférerais une fonction qui retourne un tableau de tous les types auxquels cette UTI se conforme.

Il semble y avoir de l'espoir pour moi, comme MDItemCopyAttributeList() retournera une telle liste. Cela dit, il faut un MDItemRef, qui peut être créé à partir d'un chemin de fichier ou d'une URL - ce qui n'est pas génial. Parfois, mes données ne sont stockées qu'en mémoire et je n'ai qu'un type MIME à utiliser. Dois-je parcourir la base de données complète des infections urinaires pour obtenir cette information ou est-ce que quelque chose me manque?

Répondre

7

Il me manquait en effet quelque chose: la solution très évidente. Alors que je chalutais à travers les symboles exportés par LaunchServices (et remarqué l'intéressant, mais privé UTTypeCopyPedigree()), je me suis souvenu de UTTypeCopyDeclaration(), qui est défini.

UTTypeCopyDeclaration() est donné un UTI et renvoie (comme CFDictionaryRef) la liste des propriétés dans laquelle l'UTI a été défini. L'objet dans ce dictionnaire avec la clé kUTTypeConformsToKey est soit CFArrayRef ou CFStringRef. Dans le cas d'un tableau, on peut récurer récursivement jusqu'à ce qu'un type de base soit atteint.

Voici comment j'ai construit un arbre d'héritage pour une UTI donnée. J'espère que cela aide quelqu'un d'autre avec le même problème.

Questions connexes