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;
}
答案 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
”即可。