在从该模板类派生ATL类时,将ATL Wizard自动生成的对IDispatch接口的实现注释,而使用新定义的CCPP2ATLTemplateBase,如下代码片断所示:
class ATL_NO_VTABLE CATLXX :
……,
// 将ATL Wizard生成的对IDispatch接口的支持注释
// public IDispatchImpl<IXX, &IID_IXX, &LIBID_CPP2ATLLib>,
// 添加ATL模板基类
public CCPP2ATLTemplateBase<CImplementXX, IXX, &IID_IXX, &LIBID_CPP2ATLLib>
{
……
}
3.2. 复杂类型的传出参数从C++指针转换为接口指针基本上不存在困难,为方便使用,我们提供一个基于本技术方案的宏定义,如下代码所示:
/**********************************************************
从C++指针获取对应ATL接口的宏
传入:C++指针,对应的ATL类名,接口IID
传出:接口指针,执行状态HRESULT
**********************************************************/
#define CPPOBJ_TO_COM_INTERFACE(pCPPObj, CATLClass, IID_IDefine, ppInterface, hResult ) \
{ \
ASSERT(pCPPObj != NULL); \
if (pCPPObj->m_pAssociATLUnk != NULL) \
{ \
hResult = pCPPObj->m_pAssociATLUnk-> \
QueryInterface(IID_IDefine, (void **)ppInterface); \
ATLASSERT(SUCCEEDED(hResult)); \
} \
else \
{ \
CComObject<CcomATLClass>* pComObj; \
hResult = CComObject<CcomATLClass>::CreateInstance(&pComObj); \
ATLASSERT(SUCCEEDED(hResult)); \
hResult = pComObj-> \
QueryInterface(IID_IDefine, (void **)ppInterface); \
ATLASSERT(SUCCEEDED(hResult)); \
if (hResult == S_OK) \
pComObj->Link2CPPObj(pCPPObj, *ppInterface); \
}\
}
4. 接口的继承与多态C++类的继承应用十分广泛,动态化后的组件应该保留原C++类之间的继承关系。在我们的技术方案中,C++类和接口一一对应,C++类的继承关系也应该体现在各个接口上,如下图所示: