0

次のコードを使用して、アプリケーションのパスを取得しています。すべての場合に機能しますが、最前列では失敗します。

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);
    }

アプリケーションフォルダからのアプリケーションパスを期待していましたが、それは/ system /coreservices/から来ています。

これは、/ system / library / coreservices/..に存在するすべてのアイテムで発生します。

/ system / library / coreservices ..またはより良い解決策を探すべきではないということはありましたか?誰か助けてもらえますか?

前もって感謝します。

4

1 に答える 1

1

アプリケーションを識別するためのより信頼性の高い方法は、バンドル識別子によるものです。たとえば、Front Rowの場合、同じ名前の2つの別個のアプリケーションがあります。

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

バンドル識別子を見ると、/ Applicationsにあるものは単なるランチャーであるため、この関数は結局正しい最前列へのパスを返しているように見えます。

ただし、これに依存するべきではありません。関数はいつでもランチャーのパスを返す可能性があります。さらに、誰でもアプリケーションバンドルを作成して「最前列」という名前を付けることができます。

バンドル識別子を使用して、常に正しいアプリケーションを要求するようにします。

于 2009-12-30T08:47:01.200 に答える