跳轉到內容

Futurebasic/Language/cfurlref

來自華夏公益教科書,自由的教科書

CFURLRef 結構

[編輯 | 編輯原始碼]

透過 URL 訪問檔案和資源。

CFURL 提供了建立、解析和取消引用 URL 字串的功能。CFURL 對需要使用 URL 訪問資源(包括本地檔案)的應用程式很有用,因此在這裡包含它。

蘋果工程師讓 CFURL 與其 Cocoa Foundation 的對應項 NSURL 實現“無縫橋接”。對於 FB 和 FBtoC 程式設計師來說,這是一個好訊息,因為網上有很多可移植到我們的 Carbon 程式碼中的 Cocoa 程式碼片段。

一個 CFURL 物件由兩個部分組成

   1.) 一個基本 URL,它可以為空,在 C 中為 0 或 NULL,以及

   2.) 一個相對於基本 URL 解析的字串。

一個字串完全解析而沒有基本 URL 的 CFURL 物件被認為是絕對的;所有其他都被認為是相對的。

例如,假設您的 FutureBASIC 應用程式儲存在您的 OS X Applications 資料夾中,在一個名為“FutureBASIC 4.1.1”的資料夾中,其可執行檔案的絕對 CFURL 路徑將是

/Applications/FutureBASIC\ 4.1.1/FutureBASIC.app/Contents/MacOS/FutureBASIC 

此物件已完全解析,因為它是在其所在的卷的根級別上的完整路徑。

另一方面,一個未完全解析的相對路徑將是

/FutureBASIC.app/Contents/MacOS/FutureBASIC

此相對路徑定義了 FutueBASIC 可執行檔案在 FutureBASIC.app 包中的位置,但沒有指示 FutureBASIC 應用程式位於何處。

CFURL 物件由 CFURLRef 定義。與其他 Core Foundation 物件引用一樣,CFURLRef 是 不透明型別。它們的內部組成沒有在 Apple 文件中記錄,並且它們透過 Toolbox 函式訪問和操作。

在 CFURL 及其關聯的 CRURLRef 發揮作用的領域中,有一個是 在 OS X 包中定位資源

這個例子,釋出在 FutureBASIC 郵件列表 上——該郵件列表是 FB 和 FBtoC 使用者的寶貴資源——演示了一種技術,用於獲取到包內 ReadMe 文字檔案的 CFURLRef,並將 CFURL 傳遞給 OS X 系統 Launch Services,Launch Services 接著為使用者開啟檔案以供在系統的預設文字應用程式中閱讀。

include "Tlbx LSOpen.incl"
include "Tlbx CFBundle.incl"
include "Subs DEF USR CFPrefs.incl"

toolbox fn CFBundleCopyResourceURL( CFBundleRef bundle,¬
                              CFStringRef resourceName,¬
                              CFStringRef resourceType,¬
                                CFStringRef subDirName ) = CFBundleRef

local fn OpenReadMe( readMeName as Str255 )
 dim as CFBundleRef  bundle
 dim as CFURLRef     url

 bundle = fn CFBundleGetMainBundle
  long if( bundle )
    url = fn CFBundleCopyResourceURL( bundle, fn CFSTR( readMeName ), 0, 0 )
    long if( url )
      call LSOpenCFURLRef( url, #0 )
    end if
  end if
  
  CFRelease( url )

end fn

fn OpenReadMe( "ReadMe.txt" )

do
handleevents
until gFBQuit

這裡還有另一個函式,它使用 CFURLRef 為 QuickTime 識別的幾種型別的影像檔案(JPEG、PNG、TIFF 等)之一建立影像引用——同樣位於捆綁應用程式的資原始檔夾中

local mode
local fn CreateCGImageFromBundleResource( fileName as CFStringRef )
 dim as CFURLRef           url
 dim as CGImageRef         imageRef
 dim as CGDataProviderRef  sourceRef

 image = 0
 url = fn CFBundleCopyResourceURL( fn CFBundleGetMainBundle(), fileName, 0, 0 )
   long if ( url )
     sourceRef = fn CGImageSourceCreateWithURL( url, 0 )
     long if ( sourceRef )
       imageRef = fn CGImageSourceCreateImageAtIndex( sourceRef, 0, 0 )
     end if
   end if

 CFRelease( url )
 CFRelease( sourceRef )

end fn = imageRef

(更多討論待續)

0100 1101 0110 1001 0110 0100 0110 1110 0110 1001 0110 0111 0110 1000 0111 0100

0043 6f64 6572

華夏公益教科書