BREW applet的类特征
——目录——
引言
1、appgun创建过程简述
2、appgun为什么是一个类
3、appgun的类实例结构体解析
结语
引言
本篇创建一个applet,applet的名字叫gun,简称appgun。通过分析appgun的创建过程来揭示appgun的类本质。
1、appgun创建过程简述
1)首先定义一个Cappgun结构体,里面定义appgun的所有数据成员:
typedef struct _Cappgun
{
AEEApplet a;
datatype customdata
......
}Cappgun;
注意,Cappgun的第一个成员必须是一个AEEApplet结构体(标准成员)。
2)接下来,在CreateInstance函数里,调用下面的函数来创建appgun:
AEEApplet_New(sizeof(Cappgun),
clsID,
pIShell,
pIModule,
&pme,
(AEEHANDLER)Cappgun_handleEvent,
(PFNFREEAPPDATA )Cappgun_FreeApp);
参数一:appgun的实例大小;参数二、三、四:直接从CreateInstance的入参而来;参数五:Cappgun类型的指针;参数六:appgun的事件处理函数;参数七:appgun的资源释放函数。
AEEApplet_New的作用是为appgun创建一个实例,让pme指向这个实例,并注册appgun的事件处理函数和资源释放函数,其中事件处理函数为必须,资源释放函数可以为NULL。
3)去实现Cappgun_handleEvent和Cappgun_FreeApp。
这是就创建appgun的主要过程,是不是很简单?
2、appgun为什么是一个类
想一下002篇中接口IStringParse的创建过程,它的CreateInstance函数是这样的:
int AEEClsCreateInstance(AEECLSID ClsId, IShell *pIShell, IModule *pIModule, void **po)
{
if(AEECLSID_STRINGPARSE != ClsID)
{
return EFAILED;
}
return new(pIShell, pIModule, po);
}
最后的语句是调用new函数,这个new函数的功能就是创建接口IStringParse的类实例,再看看我们的appgun的实例创建函数AEEApplet_New,区别在于,appgun的实例创建函数不是自已实现的,而是直接使用了BREW提供的标准函数,而IStringParse的实例创建函数是接口自己来实现的。所以appgun与IStringParse的创建机制是一样的,appgun也是一个BREW类。
再来看看AEEApplet_New,它的实现在AEEAppGen.c里,在AEEAppGen.c里实现了一个接口IApplet,而AEEApplet_New即是IApplet的new函数。所以appgun就是一个IApplet类,而appgun的创建过程就是创建了一个IApplet类的实例。
3、appgun的类实例结构体解析
更确切地说,appgun是一个扩展的IApplet接口,从第1节appgun的创建过程我们看到,appgun对IApplet的类实例结构体做了扩展。appgun的类实例结构体是Cappgun,它的第一部分是IApplet的类实例结构体AEEApplet,AEEApplet定义在AEEAppGen.h里。
IApplet的new函数提供了对这种扩展的支持,对比AEEApplet_New(即IApplet的new函数)的声明与IStringParse的new函数的声明,我们看到AEEApplet_New允许通过参数来指定为实例分配的空间大小,而IStringParse的new函数为实例分配的空间大小是固定的,这便是IApplet的new函数的巧妙之处。
由于我们在定义Cappgun时保证了Cappgun的起始位置是一个AEEApplet成员,所以IApplet仍可以像对待AEEApplet一样来对待Cappgun,所以这种扩展机制,既不会影响IApplet的行为,也给applet提供了一块自己的空间。
结语
创建一个applet比创建一个扩展接口要简单得多。IApplet接口为applet准备好了一切,包括接口的定义、类实例结构体的定义、接口函数的实现,事件处理函数和资源释放函数的声明,以及事件处理机制,applet要做的就是扩展一下类实例结构体,按照IApplet的声明实现自己的事件处理函数处理自己需要的事件,按照IApplet的声明实现自己的资源释放函数用于在applet退出时自动释放applet的各类资源(当然如果觉得没必要,也可以不要资源释放函数)。