我正在使用碳框架在Mac上编写一个C++插件(是的,是的,我知道,苹果反对碳,但目前我无法将这段代码迁移到Cocoa)。我的插件由主应用程序加载,我需要获得插件的CFBundleRef引用,这样我就可以访问它的资源。
问题是,当我在插件的初始化例程中调用CFBundleGetMainBundle()时,它会返回对主机的包引用的引用,而不是插件的引用。
注意:我不愿使用编译时确定的任何内容,包括使用硬编码字符串标识符调用CFBundleGetBundleWithIdentifier()。
发布于 2010-03-26 04:23:21
请参阅这篇文章出现在carbon dev邮件列表上。,这似乎是一种类似的情况。
给出的方法是
我建议使用CFBundleGetBundleWithIdentifier。您的插件应该有一个唯一的标识符;类似于“com.apple.dts.iTunes_plug”之类的东西。在插件的包的CFBundleIdentifier中查找info.plist属性。
发布于 2010-03-26 05:10:19
注意:我不愿使用编译时确定的任何内容,包括使用硬编码字符串标识符调用CFBundleGetBundleWithIdentifier()。
因为那是湿的对吧?
下面是你如何使这个解决方案变干。
首先,在头文件中为此定义一些宏,如下所示:
#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前缀头,或者(如果已经设置了)将其设置为该头。最后,在Info.plist中,将包标识符设置为MY_PLUGIN_BUNDLE_IDENTIFIER
(当然是在字符串值中)。
现在您已经将包标识符写在一个地方(标头)中,C预处理程序将它放在需要的所有位置,因此您可以使用CFBundleGetBundleWithIdentifier
查找您自己的包。
发布于 2013-06-05 12:58:55
#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
,您就都设置好了
https://stackoverflow.com/questions/2523122
复制