对brew接口的一些理解

 

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)

这样接口的定义就完成了。

 

你可能感兴趣的:(api,struct,扩展,brew,interface)