描述:
有看过COM的表格驱动查找Interface的代码的朋友吗?
我有一个疑问,
#define offsetofclass(base, derived) ((DWORD)(static_cast<base*>((derived*)_ATL_PACKING))-_ATL_PACKING)
为什么不改为
#define addressofclass(base, derived) ((DWORD)(static_cast<base*>(this))
这样不是不用做(char*)this + offsetofclass运算,而直接得到地址。
解决方案1:
3. 分析offsetofclass:
#define _ATL_PACKING 8//注意_ATL_PACKING 是一个常量。
((DWORD)(static_cast<base*>((derived*)_ATL_PACKING))-_ATL_PACKING)//
这句语义是先将_ATL_PACKING强制转换为derived指针在转换为base指针,这时
static_cast<base*>((derived*)_ATL_PACKING))就等于vptr的值了;然后减去_ATL_PACKING
得到的是该vptr的偏移值,应为4的整数倍。4表示是第一个Interface指针;8表示是第2个Interface指针;.... ....
在填充静态接口映射表时,人家只是在需要填充一个偏移量,在CoCreateInstance后查询接口时才和this指针一起算出基类地址,你这样用怎么使用静态的接口映射表?实例都没有,哪来的this呀?