【问题标题】:How do I get a bundle reference from inside of a plugin with carbon?如何从带有碳的插件内部获取包引用?
【发布时间】:2010-03-26 12:16:39
【问题描述】:
我正在使用 Carbon 框架在 Mac OS X 中编写 C++ 插件(是的,是的,我知道,Apple 正在弃用 Carbon,但目前我无法将此代码迁移到 Cocoa)。我的插件由主应用程序加载,我需要获取对我的插件的 CFBundleRef 引用,以便我可以访问它的资源。
问题是,当我在插件初始化例程期间调用 CFBundleGetMainBundle() 时,它返回对 主机 包引用的引用,而不是插件的引用。我怎样才能获得对我插件包的引用?
注意:我宁愿不使用在编译时确定的任何东西,包括使用硬编码的字符串标识符调用 CFBundleGetBundleWithIdentifier()。
【问题讨论】:
标签:
c
macos
macos-carbon
bundle
core-foundation
【解决方案2】:
注意:我宁愿不使用在编译时确定的任何东西,包括使用硬编码的字符串标识符调用 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 查找你自己的包.
【解决方案3】:
#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 就可以了