2012-06-11 70 views
3

CFBundleCopyExecutableURL函數有時會返回一個絕對URL,有時會返回絕對URL。如果在CFBundleCopyExecutableURL之前調用CFBundleCopyExecutableArchitectures,那麼url是絕對的(爲什麼?) 。如何強制這個函數總是返回絕對URL? 謝謝。CFBundleCopyExecutableURL不返回絕對URL

text getBundleExeutableUrl(text bundlePath) 
{ 
    CFURLRef url = CFURLCreateFromFileSystemRepresentation(0, 
     (char*)bundlePath.c_str(), bundlePath.length(), false); 
    CFBundleRef bundle = CFBundleCreate(0, url); 
    CFBundleCopyExecutableArchitectures(bundle); // this is necessary to get absolute path 
    CFURLRef exeUrl = CFBundleCopyExecutableURL(bundle); 
    CFStringRef srExe = CFURLCopyFileSystemPath(exeUrl, 0); 
    text bundleExe = srExe; 
    CFRelease(srExe); 
    CFRelease(exeUrl); 
    CFRelease(url); 
    CFRelease(bundle); 
    return bundleExe; 
} 

回答

2

在你的源代碼,添加是指CFURLCopyAbsoluteURL

CFURLRef exeUrl = CFBundleCopyExecutableURL(bundle); 
CFURLRef absoluteURL = CFURLCopyAbsoluteURL(exeURL); 
CFStringRef srExe = CFURLCopyFileSystemPath(absoluteURL, 0); 
CFRelease(absoluteURL); // don't forget to release what you create 

CFURLCopyAbsoluteURL」 這種額外的生產線將相對URL轉換爲絕對URL。

您應該在代碼中也許有一些錯誤檢查行(例如,在繼續之前確保URL不是NULL等)。另外,我想提及的一種風格是對象和變量聲明(例如,你的「text」)通常是大寫的(例如「CFStringRef」,「NSString」等)。參數和變量名稱以小寫字母開頭。另外,「text」令人困惑。把它叫做「CFStringRef」就是了。

+0

謝謝,「文本」類型是我的字符串類,它的名字就像javascript規則。 –

+0

嗯,也許我應該將其命名爲text_t(通過c規則,如wchar_t,char16_t,...)。 –