Essential COM笔记(一)

 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;

     }

}

 

 不知道那几个宏定义如何理解啊,求助了!

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值