我正在为OS X编写FileMaker Pro插件,我需要能够访问/Applications/FileMaker Pro 11/Extensions/blah.fmplugin/Contents/Resources
目录中的文件。 (但这可能是/apps/FileMaker Pro 11 Advanced/Extensions/xyz.fmplugin/Contents/Resources
或其他内容,具体取决于用户安装FMP的位置以及是否重命名插件等。)因为我无法控制用户安装FMP的位置,或者他们是否正在运行FMP或FMPA或他们是否已重命名我的插件(尽管这不如FMP与FMPA情况相比),我不知道插件包的路径。
我找到了这样的答案:Relative Paths Not Working in Xcode C++但是它为我提供了FileMaker.app中的Resources文件夹的路径,而不是我的插件。
即。我得到/Applications/FileMaker Pro 11/FileMaker Pro.app/Contents/Resources
而不是我的插件中的Resources文件夹的路径。
我是否需要在Xcode中配置以使上述解决方案正常工作?或者还有其他方法可以走上这条路吗? CFBundleGetMainBundle()调用使它看起来像是要返回应用程序本身的包而不是插件。
我找到了一些基于Bundle Programming Guide和CFBundleGetBundleWithIdentifier(由mipadi提到)的可能性,但我还没有弄清楚我需要什么功能以及先决条件是什么。
答案 0 :(得分:3)
这似乎是这样做的。 CFBundleGetBundleWithIdentifier也应该有效,但我决定使用NSBundle而不是CF *。我将它放在一个.mm文件中,并将其包含在项目中。然后我可以调用get_resources_path()函数并将路径作为字符串。
#include <Foundation/Foundation.h>
#include <string>
std::string *get_resources_path()
{
NSBundle *bundle;
bundle = [NSBundle bundleWithIdentifier: @"com.example.fmplugin"];
if (bundle == NULL) {
// error handling
}
NSString *respath = [bundle resourcePath];
if (respath == NULL) {
// error handling
}
const char *path = [respath UTF8String];
if (path == NULL) {
// error handling
}
return new std::string(path);
}
答案 1 :(得分:2)
如果您知道捆绑包的路径,则可以使用CFBundleCreate
;或者您可以通过CFBundleGetBundleWithIdentifier
使用捆绑标识符获取捆绑包。