在brew里有有自己的接口机制,主要是AEE的,有些是可以看到源代码的,一般都是AEE定义接口OEM有源代码实现,很多时候是没有源代码的,brew也支持自己扩展接口,下面说一些我对接口扩展的一些理解。
接口一般都是通过这样的形式定义的:
第一步:定义函数指针
#define INHERIT_IFoo(iname) /
uint32 (*AddRef)(iname*);/
uint32 (*Release)(iname*);/
int (*QueryInterface)(iname *, AEECLSID, void **)
此处是定义了一系列的函数指针,供外部接口调用。
第二步:定义虚表及虚表结构体
struct IFoo
{
struct AEEVTBL(IFoo) *VT;
void *Data;
}
这个是调用此接口用户要用到的结构体,其中VT是指向定义的一组函数指针的,Data是指向用户的数据的。
第三步:生效(in my opinion)
AEEINTERFACE_DEFINE(IFoo)
这个是brew给的接口,看看api的解释吧:
Uses an INHERIT_iname() macro and AEEINTERFACE() to define a standard BREW interface.
大概的意思就是定义一组接口。
有的人会问那函数是在那里实现的呢?
刚才不是定义了AEEVTBL(IFoo)这样一个结构体吗?下面的使用就和结构体的使用类似了,例如:
static AEEVTBL(IFoo) Funcs =
{
AddRef,//函数
Release,//函数
QueryInterface,//函数
};
Uint32 AddRef(void* po)
{
}
Uint32 Release(void *po)
{
}
Int QueryInterface(void *po,int clsid,void **ppi)
{
}
这样函数就实现了,再下来就是让他们关联起来:
IFoo *pIFoo;
pIFoo->VT = Funcs;
这样就OK了。
第四步:外部调用接口
这个就简单了,一组define就搞定的
#define Interface_AddRef(pMe) pMe->VT-> AddRef(pMe)
#define Interface_ Release(pMe) pMe->VT-> Release(pMe)
#define Interface_ QueryInterface(pMe,wparam,ppMe)
pMe->VT-> QueryInterface(pMe,wparam,ppMe)
这样接口的定义就完成了。