3

CFBundleCopyExecutableURL 函数有时会返回绝对 URL,有时则不会。如果在 CFBundleCopyExecutableURL 之前调用 CFBundleCopyExecutableArchitectures,则 url 是绝对的(为什么?)。如何强制此函数始终返回绝对 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;
}
4

1 回答 1

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”即可。

于 2012-06-11T15:34:32.923 回答