2.9节讲到QueryInterface的优化,以下看不懂啊,所以做个标记,希望有大侠来讲解下。
实现表格驱动(table-driven)的interface:
inttable.h
//扩展性函数的typedef
typedef HRESULT (*INTERFACE_FINDER)(void * pThis, DWORD dwData, REFIID riid, void **ppv);
//为函数表明表项就是偏移
#define ENTRY_IS_OFFSET INTERFACE_FINDER(-1)
//表的基本布局
typedef struct _INTERFACE_ENTRY
{
const IId *pIID; //匹配IID
INTERFACE_FINDER pfninder; //寻找函数
DWORD dwDate; //偏移值
}INTERFACE_ENTRY;
#define BASE_OFFSET(ClassName, BassName)/
(DWORD (static_cast<BassName*> (reinterpret_cast<ClassName*>(0x1000000))) - 0x1000000)
#define BEGIN_INTERFACE_TABLE(ClassName)/
typedef ClassName_ITCls;/
const INTERFACE_INTER *GetInterfaceTable(void) {/
static const INTERFACE_INTER table[] = {/
#define IMPLEMENTS_INTERFACE(Itf)/
{#IID_##Itf, ENTRY_IS_OFFSET, BASE_OFFSET(_ITCls, Itf) },
#define IMPLEMENTS_INTERFACE_AS(req, Itf)/
{&IID_##req, ENTRY_IS_OFFSET, BASE_OFFSET(_ITCls, Itf) },
#define END_INTERFACE_TABLE()/
{0,0,0}}; return table;}
inttable.cpp
HRESUL InterfaceTableQueryInterface(void *pThis,
const INTERFACE_ENTRY *pTable,
REFIID *riid, void **ppv)
{
if(InlineIsEqualGUID(riid, IID_IUnknown))
{
*ppv = (char*)pThis + pTable->dwData;
((IUnknown *) (*ppv))->AddRef();
return S_OK;
}
else
{
HRESULT hr = E_NOINTERFACE;
while (pTable->pfnfinder)// null fn ptr==EOT
{
if(pTable->pfnfinder == ENTRY_IS_OFFSET)
{
*PPV = (char*)pThis + pTable->dwData;
((IUnknown *) (*ppv))->AddRef();
hr = S_OK;
break;
}
else
{
hr = pTable-pfnfinder(pThis, pTable->dwDate, iid, ppv);
if(hr == S_OK) break;
}
pTable++;
}
if(hr != S_OK) *ppv = 0;
return hr;
}
}
不知道那几个宏定义如何理解啊,求助了!