有看过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运算,而直接得到地址。
我有一个疑问,
#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运算,而直接得到地址。
解决方案 »
- vc2010如何让tab控件上的静态文本的背景和tab一样啊?求大神帮忙~~~
- 有谁知道共享软件作者 周弈 在开始卖软件后有段时间出了什么事? (很早的事情了)
- webbrowers 控件 采用POST提交问题?
- vc不能调试,一按F5就进入反汇编窗口
- ATL新建的Dialog(dll)工程中加什么东东能使classes中出现如CAdoQueryApp的类啊
- 关于tcp/ip端口的问题,有些迷茫...
- 如何使在一个对话框窗口中的控件对齐窗口底部,当窗口的大小改变使其与窗口底部相对位置不变呢?
- 如何在程序里得到资源文件的内容?
- error LNK2001: unresolved external symbol _IID_IDirectDraw4?
- 哪里有vc6自带的ActiveX控件的使用方法?
- 请教:如何将1000个.txt文件合成一个.txt文件?
- 【急】怎样判断ShellExecute是否执行完毕?
看:
#define BEGIN_COM_MAP(x) public: ... ...
HRESULT _InternalQueryInterface(REFIID iid, void** ppvObject) { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static _ATL_INTMAP_ENTRY* WINAPI _GetEntries() { static const _ATL_INTMAP_ENTRY _entries[] = { DEBUG_QI_ENTRY(x)
#define END_COM_MAP() {NULL, 0, 0}}; return &_entries[1];} virtual ULONG STDMETHODCALLTYPE AddRef( void) = 0; virtual ULONG STDMETHODCALLTYPE Release( void) = 0; STDMETHOD(QueryInterface)(REFIID, void**) = 0;
调用_GetEntries()时以对象构造完成了。
{
..........
IUnknown* pUnk = (IUnknown*)((int)pThis+pEntries->dw);
..........
}
首先,offsetofclass目的是填充静态表格,供QueryInterface()用;
由上面的代码可以知道pUnk是由pThis+偏移得到。注意,这里的偏移pEntries->dw和由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指针;.... ....
这些已经想过了。
在上面,对比一下虚拟函数表,就比较容易得到这个结论。虚拟函数表画起来不方便,自己看书吧。4. 用addressofclass,,它是在运行时刻产生的。宏展开后,结构的赋值为
static const INTERFACE_ENTRY table[]={
... ...
{IID_IXxxx,_SIMPLE/*有点记不清了*/,((DWORD)(static_cast<base*>(this))}
... ...
{0,0,0}};
注意到table为一个const指针,const要求table指向的对象为常量;而this为变量,与const语义冲突第一次来,不知道为什么只能发3条,第四条怎么也发不出。而一次全发也不行。只好这样了!