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++类的继承关系也应该体现在各个接口上,如下图所示:
4.1. 支持继承的系列atl模板基类
实现接口继承的实质是为派生atl类添加基接口,而为一个atl类添加接口的实质则是:
l 修改idl文件,体现接口的继承关系
l 在atl类中提供接口实现
修改idl文件很简单,只需要更改派生接口的基接口即可。lOcALhOst在atl类中添加基接口的实现倒颇费思量,我们的做法是:
l 扩展atl模板基类的意义,每一个atl组件类都对应一个模板基类,都从该模板基类派生
l 派生类的模板基类,从基类的模板基类中派生;ccpp2atltemplatebase是模板派生树的根节点,所有的模板都派生自ccpp2atltemplatebase
l 所有的接口方法,都在对应的模板基类中实现
atl派生类继承自它对应的模板基类,这个模板基类又继承自atl基类对应的模板基类,而在atl基类的模板基类中提供了基接口的实现。所以,atl派生类最终继承了基接口的实现。c++类、atl类、各模板基类的继承关系如下图所示:

假定ibaseitf是基接口,iinherititf是派生接口。atl基类对应的模板基类定义如下:
/****************************************************************************
模板类catlbaseitf,提供了ibaseitf的实现,
用于将ibaseitf接口作为基接口共供其它接口继承
****************************************************************************/
template <class t, class q, const iid* piid, const guid* plibid = &ccommodule::m_libid>
class atl_no_vtable catlbaseitf : public ccpp2atltemplatebase<t, q, piid, plibid>
{
public:
// 基接口方法“basefunc”,在此模板类内实现
stdmethod(basefunc)()
{
m_pcppobj->basefunc();
return s_ok;
}
};
atl派生类对应的模板基类定义如下:
/****************************************************************************
模板类catlinherititf,继承了基接口ibaseitf方法的实现,
同时提供了iinherititf的实现,可以将iinherititf接口作为基接口共供其它接口继承
****************************************************************************/
template <class t, class q, const iid* piid, const guid* plibid = &ccommodule::m_libid>
class atl_no_vtable catlinherititf : public catlbaseitf<t, q, piid, plibid>
{
public:
// 派生接口方法“inheritfunc
[1] [2] [3] 下一页