ATL功能一组用于所谓COM映射的宏。COM映射是一个表,它将接口GUID与偏移量相关联,该偏移量将添加到这个
指针以获取相应的子对象-整个内容可以替换显式static_cast
,用于IUnknown::QueryInterface()
内部的上行。
映射条目是通过使用<code>offsetofclass</code>宏构建的:
#define _ATL_PACKING 8
#define offsetofclass(base, derived)
((DWORD_PTR)(static_cast<base*>((derived*)_ATL_PACKING))-_ATL_PACKING)
为了这个问题的可读性,我将把它重写为以下伪代码“函数”:
derived* derivedPointer = (derived*)_ATL_PACKING;
base* basePointer = static_cast<base*>(derivedPointer);
DWORD_PTR offset = (DWORD_PTR)(basePointer)-_ATL_PACKING;
看起来很合理——它获得一个指向假想派生对象的指针,然后执行显式static_cast
来移动指针,然后计算这些假想对象之间的距离。
问题是为什么常数8在那里?为什么我们需要这个常数,为什么它被选择为8?