CFBundleCopyExecutableURL不返回绝对URL

时间:2012-06-11 10:36:16

标签: macos cocoa macos-carbon

CFBundleCopyExecutableURL函数有时返回绝对URL,有时则返回no。 如果在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;
}

1 个答案:

答案 0 :(得分: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不为NULL)。

另外,我想提到的一个风格是对象和变量声明(例如你的“text”)通常是大写的(例如“CFStringRef”,“NSString”,等等。)。参数和变量名称以小写字母开头。此外,“text”令人困惑。只需将其称为“CFStringRef”即可。