实现代码如下所示:
template <class T>
class CCPP2ATLTemplateBase :
{
protected:
// C++类指针
T* m_pCPPObj;
// 标识继承该模板的ATL对象是否由内部维护
BOOL m_bInnerManage;
public:
/**********************************************************
模板的构造函数,实现如下功能:
1、new一个C++实现类对象
2、缺省情况下,ATL对象由外部维护,将内部维护标识设为FALSE
3、将C++类中对ATL接口的反指指针设置为空
**********************************************************/
CAtlCPP2ATLTemplateBase()
{
m_pCPPObj = new T;
m_bInnerManage = FALSE;
m_pCPPObj->m_pAssociATLUnk = NULL;
}
/**********************************************************
析构ATL对象时,如果该ATL对象是由外部创建的,信捷职称论文写作发表网,
则显式的删除C++对象
如果ATL对象由内部维护,那么什么事都不用做
**********************************************************/
virtual ~CAtlCPP2ATLTemplateBase()
{
if (!m_bInnerManage) {
if (m_pCPPObj)
delete m_pCPPObj;
}
}
/**********************************************************
Link2CPPObj函数,负责绑定C++对象和ATL接口
1、删除构造函数中new的C++对象,而使用外部传入的C++对象
2、将ATL对象的内部维护标识设为TRUE
3、设置C++基类中的接口指针成员
4、因为ATL接口传送给外部使用,需要增加引用计数
**********************************************************/
virtual void Link2CPPObj(T* pObj, IUnknown* pUnk)
{
ASSERT(pObj != NULL);
ASSERT(pUnk != NULL);
if (m_pCPPObj)
delete m_pCPPObj;
m_pCPPObj = pObj;
m_bInnerManage = TRUE;
m_pCPPObj->m_pAssociATLUnk = pUnk;
m_pCPPObj->m_pAssociATLUnk->AddRef();
}
};
然后,每个ATL类都从该模板类派生,如下代码片断所示:
class ATL_NO_VTABLE CATLXX :
……,
// 添加ATL模板基类
public CCPP2ATLTemplateBase<CImplementXX>
{
……
}