跳转到内容

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

华夏公益教科书