2009-12-29 139 views
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); 
    } 

我是從應用程序文件夾期待應用程序的路徑,但它來源於/系統/ coreservices/..

出現這種情況的所有項目呈現/系統/庫/ coreservices/..。

是否有任何它不應該看/ system/library/coreservices ..或任何更好的解決方案? 任何人都可以幫助我嗎?

在此先感謝。

+0

你有什麼具體問題?它沒有找到應用程序,還是它返回了你不期望的路徑? – 2009-12-30 06:26:07

+0

它的路徑。 在System/Library/CoreServices/..中有一個FrontRow.app,它也存在於/ Applications/..路徑中。 我期待/應用程序/前排,但它給了我係統/庫/ CoreServices /前排 – MacGeek 2009-12-30 07:23:04

回答

1

識別應用程序的更可靠的方法是使用包標識符。前排的情況下,例如,有兩個獨立的應用程序具有相同的名稱:

  • /應用/前Row.app:com.apple.frontrowlauncher
  • /系統/圖書館/ CoreServices /接待Row.app:com.apple.frontrow

望着束標識符,它看起來像這樣函數返回的路徑正確的Front Row畢竟,因爲一個在/應用程序僅僅是一個啓動程序。

但是你不應該依賴這個功能 - 該功能可以隨時返回啓動程序的路徑。而且,任何人都可以創建一個應用程序包並將其命名爲「Front Row」。

使用包標識符,以便您始終要求正確的應用程序。

+0

我只有應用程序名稱與我。例如前排。我沒有包標識符。 – MacGeek 2009-12-30 13:02:32

+0

你能更具體嗎?它是如何獲得名稱的,而不是您想要的應用程序的包標識符? – 2009-12-30 13:52:14

+0

它實際上是一個客戶端服務器應用程序,其中服務器發送要啓動或關閉的應用程序的名稱。所以,在客戶端,我只有應用程序的名稱,在其上執行操作。 – MacGeek 2009-12-30 14:16:10

相關問題