【问题标题】:fetch the path of the application获取应用程序的路径
【发布时间】:2009-12-29 12:30:22
【问题描述】:

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

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.. 或任何更好的解决方案? 谁能帮帮我?

提前致谢。

【问题讨论】:

  • 您遇到了什么具体问题?是没有找到应用程序,还是返回了您不期望的路径?
  • 它的路径。在 System/Library/CoreServices/.. 中有一个 FrontRow.app,它也存在于 /Applications/.. 路径中。我期待 /Applications/Front Row,但它给了我 System/Library/CoreServices/Front Row

标签: macos macos-carbon


【解决方案1】:

识别应用程序的更可靠方法是通过包标识符。以 Front Row 为例,有两个不同的应用程序同名:

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

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

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

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

【讨论】:

  • 我只有应用程序名称。例如前排。我没有捆绑标识符。
  • 你能说得更具体点吗?你怎么能有你想要的应用程序的名称而不是包标识符?
  • 它实际上是一个客户端服务器应用程序,服务器发送要启动或关闭的应用程序的名称。因此,在客户端,我只有应用程序的名称,将在其上执行操作。
  • 你也在写服务器吗?如果是这样,让它发送包标识符而不是名称。
  • 不,我不是在写服务器。使它发送捆绑标识符而不是名称不能是解决方案。从用户的角度来看,如果我发送名称。我猜,我们需要做一些事情,比如从名称中获取正确的包标识符。这又把我们带到了同一点。还有其他解决方案吗?
猜你喜欢
  • 2014-11-07
  • 2011-09-08
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多