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;
}
最佳答案
在源代码中,添加引用 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
”即可。
关于macos - CFBundleCopyExecutableURL 不返回绝对 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10978512/