Programming 版 (精华区)
发信人: lofe ()感激生活(), 信区: Programming
标 题: ATL接口映射宏详解--(7)
发信站: 哈工大紫丁香 (Sun Sep 3 08:16:44 2000), 转信
七、COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid) 参ATL例程COMMAP
先看看这个宏的定义:
#define COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)\
{&iid,\
(DWORD)&_CComCacheData<\
CComAggregateCreator<_ComMapClass, &clsid>,\
(DWORD)offsetof(_ComMapClass, punk)\
>::data,\
_Cache},
先看看它的典型用法:
class CAutoAgg :
public IDispatchImpl<IAutoAgg, &IID_IAutoAgg, &LIBID_AGGREGLib>,
public ISupportErrorInfo,
public CComObjectRoot,
public CComCoClass<CAutoAgg,&CLSID_CAutoAgg>
{
......
};
与一般的组件并无二样。
class COuter :
public CChainBase,
public IDispatchImpl<IOuter, &IID_IOuter, &LIBID_COMMAPLib>,
public CComCoClass<COuter,&CLSID_COuter>
{
BEGIN_COM_MAP(COuter)
COM_INTERFACE_ENTRY_AUTOAGGREGATE(IID_IAutoAgg, m_pUnkAutoAgg.p,
CLSID_CAutoAgg)
END_COM_MAP()
CComPtr<IUnknown> m_pUnkAutoAgg;
};
与宏COM_INTERFACE_ENTRY_AGGREGRATE(_)不同,COuter不用在FinalConstruct中创建聚
集组件。外部组件会自动创建聚集组件!!!
1。
template <class Creator, DWORD dwVar>
_ATL_CACHEDATA _CComCacheData<Creator, dwVar>::data = {dwVar, Creator::Creat
eInstance};
2。
static HRESULT WINAPI _Cache(void* pv, REFIID iid, void** ppvObject, DWORD dw)
{
HRESULT hRes = E_NOINTERFACE;
_ATL_CACHEDATA* pcd = (_ATL_CACHEDATA*)dw;
IUnknown** pp = (IUnknown**)((DWORD)pv + pcd->dwOffsetVar);
if (*pp == NULL)
hRes = pcd->pFunc(pv, IID_IUnknown, (void**)pp);
if (*pp != NULL)
hRes = (*pp)->QueryInterface(iid, ppvObject);
return hRes;
}
3。
template <class T, const CLSID* pclsid>
class CComAggregateCreator
{
public:
static HRESULT WINAPI CreateInstance(void* pv, REFIID/*riid*/, LPVOID* ppv
)
{
ATLASSERT(*ppv == NULL);
ATLASSERT(pv != NULL);
T* p = (T*) pv;
return CoCreateInstance(*pclsid, p->GetControllingUnknown(),
CLSCTX_INPROC, IID_IUnknown, ppv);
}
};
因为_Cache,_CComCacheData,CComAggregateCreator这几个类和函数我们已经在前面见
过或者见过类似的,所以就不再多讲了。总之我们可以看到,若m_pUnkAutoAgg.p不为空
则直接查询,否则创建聚集组件。
与宏COM_INTERFACE_ENTRY_AGGREGATE相比,这个宏似乎更好一些,仅当需要时才会创建
使用更简单。
-------------未完待续--------------
--
才疏学浅,胡言乱语;不对之处,敬请指正。
路漫漫兮,其修远。
吾将上下而求索。
※ 修改:.haojs 于 Sep 3 08:14:20 修改本文.[FROM: bbs.hit.edu.cn]
--
※ 转寄:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: bbs.hit.edu.cn]
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: haojs.bbs@bbs.whnet.]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.990毫秒