brew 中的接口机制
2006-12-21 14:31
330 查看
接口是一个很广泛使用的概念,在 C++ 里面是纯虚函数,在JAVA里面就是interface,而在在brew里面也有类试的接口机制.
我们看一个最简单的写屏幕的例子.
IIMAGE_Draw(pImg, nPosX, nPosY);
在头文件里面找到,
#define IIMAGE_Draw(p,x,y) GET_PVTBL(p,IImage)->Draw(p,x,y)
其中GET_PVTBL 是一个宏,展开后可以看到
#define GET_PVTBL(p,iname) ((iname*)p)->pvt
其实就是把我们传进去的p,强转成IImage 指针, 所以
IIMAGE_Draw(pImg, nPosX, nPosY); 就可以等价于 ((IImage*)pImg)->pvt->Draw(p,x,y)
这个pvt又是什么呢,继续查看IImage指针的定义 typedef struct _IImage IImage ,IImage 是一个伪类型,那么_IImage的结构是怎样的.
在AEEIMage.h 这个头文件里面我们看到下面一些语句:
QINTERFACE(IImage)
{
DECLARE_IBASE(IImage)
void (*Draw)(IImage * po, int x, int y);
void (*DrawFrame)(IImage * po, int nFrame, int x, int y);
void (*GetInfo)(IImage * po, AEEImageInfo * pi);
void (*SetParm)(IImage * po, int nParm, int p1, int p2);
void (*Start)(IImage * po, int x, int y);
void (*Stop)(IImage * po);
// Extended methods...
void (*SetStream)(IImage * po, IAStream * ps);
boolean (*HandleEvent)(IImage * po, AEEEvent evt, uint16 wParam, uint32 dwParam);
void (*Notify)(IImage * po, PFNIMAGEINFO pfn, void * pUser);
};
QINTERFACE 也是一个宏(怎么这么多宏)
#define QINTERFACE(iname) /
struct _##iname {/
struct VTBL(iname) *pvt;/
};/
原来_IImage 的结构是在这里定义啊,它定义了一个pvt的指针,在上文用到,它指向的是一个虚表,而这个虚表就是一个结构体,
里面的内容就是下面的那些函数指针.而在IImage初使化的时候把对于的函数指针和实际的函数定义相关联,
所以在((IImage*)pImg)->pvt->Draw(p,x,y) 的时候实际上是调用了函数指针指向的Draw方法.
我们看一个最简单的写屏幕的例子.
IIMAGE_Draw(pImg, nPosX, nPosY);
在头文件里面找到,
#define IIMAGE_Draw(p,x,y) GET_PVTBL(p,IImage)->Draw(p,x,y)
其中GET_PVTBL 是一个宏,展开后可以看到
#define GET_PVTBL(p,iname) ((iname*)p)->pvt
其实就是把我们传进去的p,强转成IImage 指针, 所以
IIMAGE_Draw(pImg, nPosX, nPosY); 就可以等价于 ((IImage*)pImg)->pvt->Draw(p,x,y)
这个pvt又是什么呢,继续查看IImage指针的定义 typedef struct _IImage IImage ,IImage 是一个伪类型,那么_IImage的结构是怎样的.
在AEEIMage.h 这个头文件里面我们看到下面一些语句:
QINTERFACE(IImage)
{
DECLARE_IBASE(IImage)
void (*Draw)(IImage * po, int x, int y);
void (*DrawFrame)(IImage * po, int nFrame, int x, int y);
void (*GetInfo)(IImage * po, AEEImageInfo * pi);
void (*SetParm)(IImage * po, int nParm, int p1, int p2);
void (*Start)(IImage * po, int x, int y);
void (*Stop)(IImage * po);
// Extended methods...
void (*SetStream)(IImage * po, IAStream * ps);
boolean (*HandleEvent)(IImage * po, AEEEvent evt, uint16 wParam, uint32 dwParam);
void (*Notify)(IImage * po, PFNIMAGEINFO pfn, void * pUser);
};
QINTERFACE 也是一个宏(怎么这么多宏)
#define QINTERFACE(iname) /
struct _##iname {/
struct VTBL(iname) *pvt;/
};/
原来_IImage 的结构是在这里定义啊,它定义了一个pvt的指针,在上文用到,它指向的是一个虚表,而这个虚表就是一个结构体,
里面的内容就是下面的那些函数指针.而在IImage初使化的时候把对于的函数指针和实际的函数定义相关联,
所以在((IImage*)pImg)->pvt->Draw(p,x,y) 的时候实际上是调用了函数指针指向的Draw方法.
相关文章推荐
- 深入BREW接口机制
- [深入分析BREW机制]:动手写BREW扩展接口
- [收录]深入BREW抽象接口机制
- [深入分析BREW机制]:BREW接口的继承特性应用
- [深入分析BREW机制]:BREW接口的引用计数机制
- Android 接口回调机制详解
- 模拟DbUtils实现接口回调机制
- Android 接口回调机制
- android_事件处理机制-监听器接口
- 忆龙2009:深入BREW模块加载机制
- Android java回调机制与自定义接口回调方法
- 多态理解,方法重写分析,类继承与接口实现中,方法重写的实现机制的区别
- Java Callable Future接口执行机制解密
- Delphi 的接口机制浅探(转)
- BREW中接口——C语言实现继承和多态
- Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析(3)
- BREW中的应用加载机制
- BREW开发教程(4):BREW消息处理机制
- BREW中的日志接口功能
- 一张图看明白android 接口回调机制