2010-10-11 11 views
6

Piszę aplikację, która korzysta z Uniform Type Identifiers. W szczególności dzwonię pod numer UTTypeCreateAllIdentifiersForTag() i przekazuję różne typy MIME.Biorąc pod uwagę UTI (Uniform Type Identifier) ​​znajdź wszystkie typy, do których jest on zgodny

Moja nadzieja była taka, że ​​ta funkcja (w odróżnieniu od UTTypeCreatePreferredIdentifierForTag()) da mi najbardziej specyficzne UTI, jak również wszystkie ZUM, do których jest on zgodny. Wydaje się, że tak nie jest - zwraca albo pojedyncze ZUM, albo wtórne ZUM są fałszywe.

Istnieje funkcja UTTypeConformsTo() zdefiniowana w tym samym pliku nagłówkowym, ale wolałbym funkcję, która zwraca tablicę wszystkich typów, do których ten ZU odpowiada.

Wygląda na to, że mam nadzieję, ponieważ taka lista zostanie zwrócona przez MDItemCopyAttributeList(). Mimo to wymaga on MDItemRef, który można utworzyć ze ścieżki pliku lub adresu URL - co nie jest świetne. Czasami moje dane są przechowywane tylko w pamięci i mam tylko typ MIME, aby przejść.

Czy muszę przechodzić przez całą bazę danych UTI, aby uzyskać te informacje, czy też czegoś brakuje?

Odpowiedz

7

Rzeczywiście czegoś mi brakowało: bardzo oczywiste rozwiązanie. Podczas gdy trałowałem przez symbole wyeksportowane przez LaunchServices (i zauważyłem interesujący, ale prywatny UTTypeCopyPedigree()), przypomniałem sobie UTTypeCopyDeclaration(), który został zdefiniowany jako ,.

UTTypeCopyDeclaration() otrzymuje UTI i zwraca (jako CFDictionaryRef) listę właściwości, w której zdefiniowano UTI. Obiekt w tym słowniku z kluczem kUTTypeConformsToKey jest albo CFArrayRef lub . W przypadku tablicy można rekurencyjnie iterować aż do osiągnięcia typu podstawowego.

W ten sposób zbudowałem drzewo dziedziczenia dla danego UTI. Mam nadzieję, że pomoże to każdemu, kto ma ten sam problem.

Powiązane problemy