Какао: Диспетчер компонентов не находит все компоненты в 64-битном приложении - PullRequest
1 голос
/ 04 февраля 2012

Я использую Диспетчер компонентов в приложении Mac, чтобы получить список установленных компонентов (мое приложение , видеоплеер , и я хочу получить список установлены кодеки QuickTime).

У меня есть такой код:

- (void) findComponents
{
    ComponentDescription desc;
    desc.componentType = 0;
    desc.componentSubType = 0;
    desc.componentManufacturer = 0;
    desc.componentFlags = 0;
    desc.componentFlagsMask = 0;

    long numComps = CountComponents( &desc );
    NSLog( @"found %ld components", numComps );

    Component aComponent = 0;
    while( (aComponent = FindNextComponent( aComponent, &desc) ) ) {
        // Do stuff with this component.
    }
}

Когда я компилирую свое 32-битное приложение, оно работает так, как я ожидал (927 компонентов возвращаются из CountComponents). Однако при компиляции 64-битной версии CountComponents возвращает только 85 компонентов (ни один из которых не является искомым кодеком QuickTime).

Документы Диспетчера компонентов ничего не говорят о 64-битных проблемах с CountComponents / FindNextComponent. Стоит отметить, что (предположительно древний) пример кода Apple DTS, на котором основан этот код , имеет ту же проблему при компиляции 64-бит.

Есть идеи, что я делаю не так? Я не хочу прибегать к ручному поиску компонентов и анализу ресурсов 'thng'.

РЕДАКТИРОВАТЬ: возможно ли, что в 64-разрядном приложении диспетчер компонентов отображает только 64-разрядные компоненты? В таком случае, возможно, эта функциональность может быть встроена в 32-битную разделяемую библиотеку и вызвана из моего 64-битного приложения?

1 Ответ

1 голос
/ 05 февраля 2012

Однако при компиляции 64-битной версии CountComponents возвращает только 85 компонентов (ни один из которых не является кодеками QuickTime, которые я ищу).

Кодеки QuickTime, использующие API QuickTime C, являются только 32-разрядными, и Apple не перенесла этот API на 64-разрядные. Обратите внимание, что для приложений вы можете использовать QTKit, новый Objective-C API. QTKit пытается использовать QuickTime X для воспроизведения фильма; если это невозможно из-за отсутствия подходящего кодека QuickTime X, он возвращается к QuickTime 7, который, в свою очередь, может использовать старые компоненты QuickTime. Это прозрачно для разработчиков, использующих QTKit.

Возможно ли, что в 64-разрядном приложении Диспетчер компонентов отображает только 64-разрядные компоненты?

Да, это правильно. Обратите внимание, что невозможно смешивать 32-битный и 64-битный код в одном и том же процессе, поэтому имеет смысл, что диспетчер компонентов будет ограничивать запросы компонентами, которые могут быть загружены в процесс: 32-битные компоненты для 32-битных компонентов. битовый процесс, 64-битные компоненты для 64-битного процесса.

В каком случае, возможно, эта функция может быть встроена в 32-битную разделяемую библиотеку и вызываться из моего 64-битного приложения?

Как описано выше, вы не сможете загрузить 32-битную динамическую библиотеку в 64-битный процесс. Вы можете создать отдельный 32-битный исполняемый файл помощника и использовать его для получения списка 32-битных компонентов. Вы можете поделиться исходным кодом, в котором перечислены компоненты, между вашим основным приложением и исполняемым файлом помощника, но они должны быть отдельными исполняемыми файлами.

Фактически, вы можете увидеть это в действии, если вы используете QuickTime X для воспроизведения фильма, для которого требуется 32-битный компонент QuickTime: 32-битный процесс QTKitServer создается для декодирования фильма с использованием компонента QuickTime и отправки результаты возвращаются к 64-битному QuickTime X. Джон Сиракуза описывает это в своем обзоре Snow Leopard . Вы также можете взглянуть на раздел Принятие QuickTime X для воспроизведения в Руководстве по программированию приложений QTKit .

...