【问题标题】: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


    【解决方案1】:

    this posting on the carbon-dev mailing list,好像情况差不多。

    那里给出的方法是

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

    【讨论】:

      【解决方案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 就可以了

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-03
          • 1970-01-01
          • 2016-08-06
          • 2021-08-18
          • 2019-09-20
          • 2017-05-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多