2010-12-14 88 views
1

我正在寫的FileMaker Pro插件OS X,我需要能夠訪問一個文件中的/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已經重新命名了我的插件(雖然這比FMP vs FMPA的情況更不可能),我不知道插件的包的路徑路徑的資源文件夾中的插件在OS X

我找到的答案是這樣的:Relative Paths Not Working in Xcode C++但給我的路徑在FileMaker.app,而不是在我的插件資源文件夾。

即我得到/Applications/FileMaker Pro 11/FileMaker Pro.app/Contents/Resources,而不是在我的插件路徑的資源文件夾。

有什麼我需要在Xcode中獲得上述解決方案的工作進行配置?或者有其他方法可以找到路徑嗎? CFBundleGetMainBundle()調用使得它聽起來像是要返回應用程序本身的包而不是插件。

我發現了一些基於Bundle編程指南和CFBundleGetBundleWithIdentifier(由mipadi提到)的可能性,但是我還沒有弄清楚我需要什麼功能以及什麼先決條件。

回答

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); 
} 
+0

這樣的有用的解決方案。謝謝!! – Stan 2014-12-16 21:41:29

2

您可以使用CFBundleCreate如果你知道路徑到您的包;或者您可以通過CFBundleGetBundleWithIdentifier使用捆綁標識符獲取捆綁軟件。

相關問題