检查 C++ 程序是否 运行 作为应用程序包或 Mac 上的命令行

Check if C++ program is running as an app bundle or command-line on Mac

有没有办法让 C++ 或 Objective-C 程序判断它是否 运行 作为命令行应用程序(例如 ./myprog 在 shell) 或作为应用程序包(例如,通过双击 Finder 中的 .app 或 运行ning open myprog.app/ 在终端中)?

目前我正在使用以下。

CFBundleRef bundle = CFBundleGetMainBundle();
CFURLRef bundleUrl = CFBundleCopyBundleURL(bundle);
char bundleBuf[PATH_MAX];
CFURLGetFileSystemRepresentation(bundleUrl, TRUE, (UInt8*) bundleBuf, sizeof(bundleBuf));

此时,bundleBuf 现在拥有 .app 包的路径 包含命令行可执行文件的目录。我可以检查字符串是否以 ".app" 结尾,但这是 hacky。有更好的方法吗?

您可以查询 URL 的统一类型标识符 (UTI)(使用 CFURLCopyResourcePropertyForKey()kCFURLTypeIdentifierKey)并查看它是否符合 kUTTypeApplicationBundle(使用 UTTypeConformsTo()).

CFStringRef uti;
if (CFURLCopyResourcePropertyForKey(bundleUrl, kCFURLTypeIdentifierKey, &uti, NULL) &&
    uti &&
    UTTypeConformsTo(uti, kUTTypeApplicationBundle))
{
    // Is bundled application
}

使用 Objective-C,您可以使用 NSWorkspace 方法 -typeOfFile:error:-type:conformsToType: 达到同样的目的。