2012-06-11 32 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,...)。 –