2010-10-11 29 views
6

Tôi đang viết một ứng dụng sử dụng Uniform Type Identifiers. Cụ thể, tôi gọi số UTTypeCreateAllIdentifiersForTag() và chuyển số khác nhau MIME.Được cung cấp một UTI (Mã định danh loại đồng nhất), tìm tất cả các loại phù hợp với

Tôi hy vọng rằng chức năng này (khác với UTTypeCreatePreferredIdentifierForTag()) sẽ cung cấp cho tôi UTI cụ thể nhất cũng như tất cả các UTI phù hợp. Điều này có vẻ không phải là trường hợp - nó trả về một UTI đơn, hoặc các UTI phụ là giả mạo.

Có chức năng UTTypeConformsTo() được xác định trong cùng một tệp tiêu đề, nhưng tôi muốn một hàm trả về một mảng của tất cả các loại mà UTI này tuân thủ.

Dường như có hy vọng cho tôi, vì MDItemCopyAttributeList() sẽ trả về danh sách như vậy. Điều đó nói rằng, nó đòi hỏi một MDItemRef, có thể được tạo từ đường dẫn tệp hoặc URL - điều này không tuyệt vời. Đôi khi dữ liệu của tôi chỉ được lưu trữ trong bộ nhớ và tôi chỉ có một loại MIME để đi qua.

Tôi có phải lặp qua toàn bộ cơ sở dữ liệu của UTI để nhận thông tin này hoặc tôi thiếu gì đó không?

Trả lời

7

Tôi thực sự đã bỏ lỡ điều gì đó: giải pháp rất rõ ràng. Trong khi tôi đang rà soát thông qua các biểu tượng được xuất bởi LaunchServices (và nhận thấy thú vị nhưng riêng tư UTTypeCopyPedigree()), tôi đã được nhắc đến UTTypeCopyDeclaration(), trong đó được xác định là.

UTTypeCopyDeclaration() được cung cấp một UTI và trả về (dưới dạng CFDictionaryRef) danh sách thuộc tính trong đó UTI đã được xác định. Đối tượng trong từ điển này có khóa kUTTypeConformsToKeyCFArrayRef hoặc CFStringRef. Trong trường hợp của một mảng, người ta có thể lặp lại đệ quy cho đến khi một loại cơ sở được đạt tới.

Đây là cách tôi xây dựng cây thừa kế cho một UTI nhất định. Tôi hy vọng điều này sẽ giúp bất kỳ ai khác có cùng một vấn đề.

Các vấn đề liên quan