3

我正在使用 Carbon 框架在 Mac OS X 中编写 C++ 插件(是的,是的,我知道,Apple 正在弃用 Carbon,但目前我无法将此代码迁移到 Cocoa)。我的插件由主应用程序加载,我需要获取对我的插件的 CFBundleRef 引用,以便我可以访问它的资源。

问题是,当我在插件初始化例程期间调用 CFBundleGetMainBundle() 时,它返回对主机包引用的引用,而不是插件的引用。我怎样才能获得对我插件包的引用?

注意:我宁愿不使用在编译时确定的任何东西,包括使用硬编码的字符串标识符调用 CFBundleGetBundleWithIdentifier()。

4

3 回答 3

1

请参阅carbon-dev 邮件列表上的此帖子,这似乎是类似的情况。

那里给出的方法是

我推荐使用 CFBundleGetBundleWithIdentifier。你的插件应该有一个唯一的标识符;类似“com.apple.dts.iTunes_plug-in”等。在插件包的 info.plist 中查找 CFBundleIdentifier 属性。

于 2010-03-26T12:23:21.937 回答
0

注意:我宁愿不使用在编译时确定的任何东西,包括使用硬编码的字符串标识符调用 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

于 2010-03-26T13:10:19.293 回答
0
#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就可以了

于 2013-06-05T20:58:55.250 回答