检查 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:
达到同样的目的。
有没有办法让 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:
达到同样的目的。