macos - CFBundleCopyExecutableURL 不返回绝对 URL

标签 macos cocoa macos-carbon

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/

相关文章:

macos - NSWindow Animate 显示/隐藏标题栏

macos - 如何在 MAC OS X 机器上部署 GTK# 应用程序

objective-c - 有没有办法从 Windows 机器编译 mac 二进制文件?

objective-c - Mac OS X 的 Spotlight 插件中的自定义关键字

swift - 如何在 SwiftyJson 中将文件转换为 JSON 对象

swift - NSTextField 中的图像显示不正确

sockets - Finder 同步扩展 : cannot communicate through UNIX domain socket

c++ - 如何使用 C++ 在 Mac OSX 中显示输入框

objective-c - 将用户数据附加到 AXObserver

macos - 核心音频和 Phantom 设备 ID