实现代码如下所示:
class CCPP2ATLObjBase
{
CCPP2ATLObjBase ();
public:
// IUnknown指针,反指向封装该CPP类的接口
IUnknown* m_pAssociATLUnk;
protected:
virtual ~ CCPP2ATLObjBase ();
};
CCPP2ATLObjBase::CCPP2ATLObjBase()
{
// 将IUnknown指针初始化为0
m_pAssociATLUnk = NULL;
}
CCPP2ATLObjBase::~CCPP2ATLObjBase()
{
// CPP类的对象析构时,Release对接口的引用
if (m_pAssociATLUnk)
m_pAssociATLUnk->Release();
}
然后,修改现有各个C++类,使之从CCPP2ATLObjBase派生,如下面代码片断所示:
class CImplement : public CCPP2ATLObjBase
{
……
};
必须指出的是,在CCPP2ATLObjBase基类中,我们设置的m_pAssociATLUnk变量存在和现有C++类成员命名冲突的问题。但是,考虑到原C++类并没有组件特性,也应该不会有“IUnknown”型指针,因此,只要各个类的变量命名都按照规范的命名法,出现这种名字冲突的可能性是极小的。
2.5. ATL模板基类通过以上分析,我们发现,所有的ATL组件类都需要实现一些相同的功能:
l 保留一个指向其绑定C++对象的指针
l 提供一个Link2CPPObj函数
l 在构造函数中创建一个绑定C++类的对象
为了减化编码,我们定义一个带参数的模板基类,实现上述公共功能,模板参数就是绑定的C++类。然后,所有的ATL组件类都从模板基类中派生。现在的技术方案如下图所示: