分享
 
 
 

Mac OS 的Component技术简介

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

Component技术主要内容为:Component体、Component Manager(CM)和客户程序(Client)。关于Component技术的完整介绍可参见Apple的官方文档:http://developer.apple.com/documentation/mac/MoreToolbox/MoreToolbox-333.html,它是Inside Macintosh一书的一个章节。

每个Component相当于一个组件类,而具体的使用必须对Component进行实例化,通过所谓Component Instance实现各种功能。一般而言,CM根据Client要求打开一个Component,就等于创建一个该Component的实例,这也被称创建一个该Component的连接(Connection)。对于这两者都有相应的变量类型予以标识。

Component的相对应标识是component identifier,句柄名称为Component:

TYPE

{component identifier}

Component = ^ComponentRecord;

ComponentRecord =

RECORD

data: ARRAY[0..0] OF LongInt;

END;

Component Instance对应标识就是Component Instance,句柄名称为ComponentInstance:

TYPE

{component instance}

ComponentInstance = ^ComponentInstanceRecord;

ComponentInstanceRecord =

RECORD

data: ARRAY[0..0] OF LongInt;

END;

上述两者在对Component及其实例的各种操作中要频繁用到。

对于Component,其描述子(Description)是一个非常重要的结构:

TYPE ComponentDescription =

RECORD

componentType: OSType; {type}

componentSubType: OSType; {subtype}

componentManufacturer: {manufacturer}

OSType;

componentFlags: LongInt; {control flags}

componentFlagsMask: LongInt; {mask for control }

{ flags}

END;

这里采用了Pascal语言是因为Component技术是继承于Mac OS 9这样的早期版本,从而保留了当时的传统。其中componentType和componentSubType是Component的类型和字类型标识,均为4字节变量,可表达一个4字母缩写。componentFlags是自定义的Component标记,前8位为系统定义保留,后24位留给Component创建者定义。componentFlagMask仅用在搜索中,是在对CM中注册的Component的列表进行搜索时的敏感标记指定。一般Client通过指定该结构使用诸如FindNextComponent之类的函数就能找到需要的Component。

Component体的主框架为一个入口函数,它一般由后面将论述的Component Manager调用。其定义一般是:

FUNCTION %ComponentEntryName%(params: ComponentParameters; storage: Handle): ComponentResult;

这里的Handle是一个分配给当前Component实例的全局存储空间的句柄。 ComponentParameters是入口函数调用的具体参数。ComponentResult是返回值,一般包含错误信息,几乎所有的和Component相关的函数定义或系统调用都采用这个返回类型。如后面所述,一切Component的功能都在入口函数里的分支调用中完成,所以该参数就指明了这种功能需求,它就是由所谓Request Code达成的,后面还要具体论述。其结构如下:

TYPE ComponentParameters =

PACKED RECORD

flags: Char; {reserved}

paramSize: Char; {size of parameters}

what: Integer; {request code}

params: ARRAY[0..0] OF LongInt; {actual parameters}

END;

这里的paramSize指明了params数组单元的个数,params就是具体分支调用Component子程序的参数。在Component的入口函数里,典型的分支就是:

CASE (params.what) OF

k%ComponentRequestName1%Select:

EntryFuncName := CallComponentFunction(params,

ComponentRoutine(@%Subroutine1%));

k%ComponentRequestName2%Select:

EntryFuncName := CallComponentFunctionWithStorage

(storage, params,

ComponentRoutine(@%Subroutine2%));

...

END;

可见,在入口函数中根据每个Request,调用不同的子程序,而调用的方法是通过CallComponentFunction或CallComponentFunctionWithStorage(子程序需要全局区的句柄以操作全局变量)。

对于Client(一般指应用程序),并不能直接调用这些分支子程序,甚至也不能调用入口。但功能的确是依据Request对应实现的。它通过定义这些功能的接口(Interface)完成。显然这种接口是语言相关的。在Mac Component的介绍中提供了一种内嵌汇编的方案,即接口函数的实现是一段短小的汇编或机器代码。忽略代码的具体内容,我们以一个名为OvalDrawer的Component中的一个功能为例来看分支子程序和与之对应的接口的关系:

分支子程序:

FUNCTION OvalSetup (globals: GlobalsHandle;

boundsRect: Rect): ComponentResult;

接口:

FUNCTION DrawerSetup (myInstance: ComponentInstance;

VAR r: Rect): ComponentResult;

并且我们在看一下在入口函数中的相应Request分支响应的情形:

kDrawerSetupSelect:

OvalDrawer := CallComponentFunctionWithStorage

(storage, params,

ComponentRoutine(@OvalSetup));

注意其中类型为Rect的参数就是这种功能调用的主参数。对于接口,很显然第一个参数指明了Component实例,它由后面叙述的打开Component操作得到;对于分支子程序,第一个参数就是全局数据区句柄,这和分支调用中使用CallComponnetFunctionWithStorage相吻合。

其实Component功能调用的一般过程就是:Client调用的接口函数触发CM,CM将接口函数参数结构化到params中传入Component的入口,在其中CallComponentFunction系统调用中params又恢复成分支调用子程序的参数并由子程序实现功能。

除了如上所述Client能打开Component并调用其功能外,Component也能调用另一个Component的功能。这一般有两种方法:一是和Client一样的方法,这样Component就成为Client;二是通过捕获(Capture)另一个Component或/且设置该Component的一个实例为目标(Target),用DelegateComponentCall调用这个被捕获或标的的Component的功能。

(未完待续)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有