获取应用程序的路径

时间:2009-12-29 12:30:23

标签: macos macos-carbon

我正在使用以下代码来获取应用程序的路径。它适用于所有情况,但前排失败。

CFStringRef cfStrAppShortName = NULL;
FSRef        appRef;
CFURLRef cfAppUrlRef = NULL;
CFBundleRef cfAppBundleRef = NULL;
CFDictionaryRef cfAppDictRef = NULL;
CFStringRef cfStrAppBundleName = NULL;
OSErr osErr;

cfStrAppShortName = CFSTR(Front Row);

if(cfStrAppShortName != NULL)
{
    osErr = LSFindApplicationForInfo(kLSUnknownCreator,NULL,cfStrAppShortName,&appRef,NULL);
    if(osErr == noErr) 
    {
        cfAppUrlRef = CFURLCreateFromFSRef ( kCFAllocatorDefault, &appRef);
        cfAppBundleRef = CFBundleCreate (kCFAllocatorDefault,cfAppUrlRef);
        cfAppDictRef = CFBundleGetInfoDictionary (cfAppBundleRef);
        cfStrAppBundleName = (CFStringRef)CFDictionaryGetValue (cfAppDictRef,kCFBundleNameKey);
    }

我期待来自Applications文件夹的应用程序路径,但它来自/ system / coreservices /..

对于/ system / library / coreservices / ..中存在的所有项都会发生这种情况。

是否有任何不应该查看/ system / library / coreservices ..或任何更好的解决方案? 任何人都可以帮助我吗?

先谢谢。

1 个答案:

答案 0 :(得分:1)

识别应用程序的更可靠方法是通过包标识符。例如,在Front Row的情况下,有两个具有相同名称的独立应用程序:

  • / Applications / Front Row.app:com.apple.frontrowlauncher
  • / System / Library / CoreServices / Front Row.app:com.apple.frontrow

查看包标识符,看起来这个函数毕竟返回正确的Front Row的路径,因为/ Applications中的那个只是一个启动器。

但是你不应该依赖它 - 该函数可以随时返回启动器的路径。此外,任何人都可以创建一个应用程序包并将其命名为“Front Row”。

使用捆绑包标识符,以便始终要求正确的应用程序。