精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>资料汇编----------藏经阁>>ATL接口映射宏详解>>ATL接口映射宏详解--(6)

主题:ATL接口映射宏详解--(6)
发信人: mrcloud()
整理人: mrcloud(2000-08-24 02:02:39), 站内信件
发信人: lostall (鸟人+衰人+猪), 信区: COM_DCOM
标  题: ATL接口映射宏详解--(6)
发信站: 武汉白云黄鹤站 (Mon Apr  3 22:12:04 2000), 站内信件

六、COM_INTERFACE_ENTRY_AGGREGATE_BLIND         参ATL例程COMMAP

  上一节我们讲了COM_INTERFACE_ENTRY_AGGREGATE,这节要介绍的宏与它很类似

   #define COM_INTERFACE_ENTRY_AGGREGATE_BLIND(punk)\
        {NULL,\
        (DWORD)offsetof(_ComMapClass, punk),\
        _Delegate},
  从定义上就可以看出,它与上一节介绍宏的唯一区别就在于,它没有指明接口
ID!!
  所以在它的定义中第一项也是NULL。
  这个宏的用法与我们COM_INTERFACE_ENTRY_AGGREGATE一模一样。大家可以参考
上一节
内容以及ATL的例程COMMAP。
  我们来看看AtlInternalQueryInterface()中的相关代码。
ATLINLINE ATLAPI AtlInternalQueryInterface(void* pThis,
        const _ATL_INTMAP_ENTRY* pEntries, REFIID iid, void** ppvObjec
t)
{
        //如果是IUnknown,....
        while (pEntries->pFunc != NULL)
        {
                BOOL bBlind = (pEntries->piid == NULL);
                if (bBlind || InlineIsEqualGUID(*(pEntries->piid), iid
))
                {
                   if (pEntries->pFunc == _ATL_SIMPLEMAPENTRY) //offse
t
                   {
                        ATLASSERT(!bBlind);
                        IUnknown* pUnk = (IUnknown*)((int)pThis+pEntri
es->dw);
                        pUnk->AddRef();
                        *ppvObject = pUnk;
                        return S_OK;
                   }
                   else
                   {
                        HRESULT hRes = pEntries->pFunc(pThis,
                                iid, ppvObject, pEntries->dw);
                        if (hRes == S_OK || (!bBlind && FAILED(hRes)))

                                return hRes;
                   }
                }
                pEntries++;
        }
        return E_NOINTERFACE;
}
注意变量bBlind;
BOOL bBlind = (pEntries->piid == NULL);
若没指定接口ID,也继续执行后面的操作,可见即使并非我们所需要的IID,也会
执行
_Delegate.


从上可见,这个宏适用于一个聚集组件有多个接口的情况,这样只要是查询这个
聚集组
件的接口,就会进入_Delegate函数。但要特别注意的是这个宏的位置!!
比如若是这样的顺序:
        BEGIN_COM_MAP
                COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_pUnkAggBlind.p)

                COM_INTERFACE_ENTRY(IOuter)
        END_COM_MAP
当查询IOuter接口时就会出错!!!


                -------------未完待续-------------
--
才疏学浅,胡言乱语;不对之处,敬请指正。



                路漫漫兮,其修远。
                吾将上下而求索。

※ 来源:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: 202.114.1.217]

--
...我是在黑夜里展翅飞翔的恐怖...

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.129.72.72]

[关闭][返回]