首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何从带有碳的插件内部获得捆绑引用?

如何从带有碳的插件内部获得捆绑引用?
EN

Stack Overflow用户
提问于 2010-03-26 12:16:39
回答 3查看 1.4K关注 0票数 3

我正在使用碳框架在Mac上编写一个C++插件(是的,是的,我知道,苹果反对碳,但目前我无法将这段代码迁移到Cocoa)。我的插件由主应用程序加载,我需要获得插件的CFBundleRef引用,这样我就可以访问它的资源。

问题是,当我在插件的初始化例程中调用CFBundleGetMainBundle()时,它会返回对主机的包引用的引用,而不是插件的引用。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-26 12:23:21

请参阅这篇文章出现在carbon dev邮件列表上。,这似乎是一种类似的情况。

给出的方法是

我建议使用CFBundleGetBundleWithIdentifier。您的插件应该有一个唯一的标识符;类似于“com.apple.dts.iTunes_plug”之类的东西。在插件的包的CFBundleIdentifier中查找info.plist属性。

票数 1
EN

Stack Overflow用户

发布于 2010-03-26 13:10:19

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

因为那是湿的对吧?

下面是你如何使这个解决方案变干。

首先,在头文件中为此定义一些宏,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
#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查找您自己的包。

票数 0
EN

Stack Overflow用户

发布于 2013-06-05 20:58:55

代码语言:javascript
代码运行次数: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,您就都设置好了

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2523122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档