Как мне получить ссылку на комплект из плагина с углеродом? - PullRequest
2 голосов
/ 26 марта 2010

Я пишу плагин C ++ в Mac OS X, используя платформу Carbon (да, да, я знаю, Apple не одобряет Carbon, но в настоящее время я не могу перенести этот код в Cocoa). Мой плагин загружается главным приложением, и мне нужно получить ссылку CFBundleRef на мой плагин, чтобы я мог получить доступ к его ресурсам.

Проблема в том, что когда я вызываю CFBundleGetMainBundle () во время процедур инициализации моего плагина, он возвращает ссылку на ссылку на пакет хоста , а не на плагин. Как я могу получить ссылку на пакет моего плагина вместо этого?

Примечание: я бы предпочел не использовать ничего определенного во время компиляции, включая вызов CFBundleGetBundleWithIdentifier () с жестко закодированным строковым идентификатором.

Ответы [ 3 ]

1 голос
/ 26 марта 2010

См. это сообщение в списке рассылки carbon-dev , что похоже на похожую ситуацию.

Метод, приведенный здесь

Я рекомендую использовать CFBundleGetBundleWithIdentifier. Ваш плагин должен иметь уникальный идентификатор; что-то вроде «com.apple.dts.iTunes_plug-in» и т. д. Найдите CFBundleIdentifier свойство в info.plist пакета вашего плагина.

0 голосов
/ 06 июня 2013
#ifdef __APPLE__
#include "CoreFoundation/CoreFoundation.h"
#endif

#ifdef __APPLE__
    // This should be actually defined somewhere else
    #define MY_PLUGIN_BUNDLE_IDENTIFIER com.yourbundle.name

    // Then all the regular stuff
    #define QUOTE(str) #str
    #define EXPAND_AND_QUOTE(str) QUOTE(str)
    #define MY_PLUGIN_BUNDLE_IDENTIFIER_STRING EXPAND_AND_QUOTE(MY_PLUGIN_BUNDLE_IDENTIFIER)

    CFBundleRef mainBundle = CFBundleGetBundleWithIdentifier(CFSTR(MY_PLUGIN_BUNDLE_IDENTIFIER_STRING));
    CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle);
    char path[PATH_MAX];
    if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX))
    {
        // error!
    }
    CFRelease(resourcesURL);

    chdir(path);
    StoragePaths::setApplicationResourcesDirectory(STR(path));
#endif

Печатает путь к вашему пакету

Примечание: для пользователей JUCE используйте JucePlugin_CFBundleIdentifier вместо MY_PLUGIN_BUNDLE_IDENTIFIER и все готово

0 голосов
/ 26 марта 2010

Примечание: я бы предпочел не использовать ничего определенного во время компиляции, включая вызов CFBundleGetBundleWithIdentifier () с жестко закодированным строковым идентификатором.

Потому что это WET , верно?

Вот как вы можете сделать это решение СУХИМ.

Сначала определите некоторые макросы для этого в заголовочном файле, например так:

#define MY_PLUGIN_BUNDLE_IDENTIFIER com.example.wiflamalator.photoshop-plugin
#define MY_PLUGIN_STRINGIFY(x) #x
#define MY_PLUGIN_BUNDLE_IDENTIFIER_STRING MY_PLUGIN_STRINGIFY(MY_PLUGIN_BUNDLE_IDENTIFIER)

Импортировать файл заголовка в код, который вызывает CFBundleGetBundleWithIdentifier. В этом коде используйте CFSTR(MY_PLUGIN_BUNDLE_IDENTIFIER_STRING).

Затем в Xcode либо установите этот файл в качестве заголовка префикса Info.plist, либо (если он у вас уже есть) #include в этот заголовок. Наконец, в Info.plist установите идентификатор пакета на MY_PLUGIN_BUNDLE_IDENTIFIER (в строковом значении, конечно).

Теперь у вас есть идентификатор пакета, записанный ровно в одном месте (заголовок), из которого препроцессор C помещает его во все места, где он должен быть, так что вы можете искать свой собственный пакет, используя CFBundleGetBundleWithIdentifier .

...