”,在此模板类内实现
stdmethod(inheritfunc)()
{
m_pcppobj->inheritfunc();
return s_ok;
}
};
更改iinherititf接口的idl定义:
[
object,
uuid(8f3902df-da55-4802-ab8a-958aff45b2f4),
dual,
helpstring("ibaseitf interface"),
pointer_default(unique)
]
// 基接口从icppobjseeker派生
interface ibaseitf : icppobjseeker
{
[id(1), helpstring("ibaseitf method")] hresult basefunc();
};
[
object,
uuid(afebd472-4bec-45ce-a5a2-e37537c4744a),
dual,
helpstring("iinherititf interface"),
pointer_default(unique)
]
// iinherititf接口从ibaseitf接口派生
interface iinherititf : ibaseitf
{
[id(11), helpstring("iinherititf method")] hresult inheritfunc();
};
最后,更改atl派生类的模板基类:
class atl_no_vtable catlinherit :
……,
public catlinherititf<cinherititfimplement, iinherititf, &iid_iinherititf, &libid_cpp2atllib>
{
……
};
现在,通过iinherititf,我们可以使用ibaseitf的所有方法,实现了接口的继承。
4.2. 接口的多态性
在实现接口的继承后,要展现接口的多态性就很容易了,只需在atl派生类声明的接口映射表中添加基接口表项即可:
class atl_no_vtable catlinherit :
……,
public catlinherititf<cinherititfimplement, iinherititf, &iid_iinherititf, &libid_cpp2atllib>
{
……
begin_com_map(cinherititf)
com_interface_entry(iinherititf)
com_interface_entry(ibaseitf)
……
end_com_map()
……
};
就象c++中基类指针所展现的多态性一样,一个“ibaseitf *”型指针可以完全操纵iinherititf接口,而不需要知道真正的接口类型。
5. 总结
至此,我们的技术方案全部介绍完毕。c++基类ccpp2atlobjbase、atl模板基类ccpp2atltempbase和基接口icppobjseeker是方案中的关键技术。ccpp2atlobjbase配合ccpp2atltempbase,完善了组件对象生命周期的管理机制;通过基接口icppobjseeker,我们可以从任意接口反向查询c++对象;ccpp2atltempbase提供了c++对象和atl组件的自由绑定功能,封装了idispatch接口的实现,而进一步定义的atl模板基类继承体系则极大的方便了接口的自由继承。
在本文快结束的时候,我们不得不特别提到microsoft的“.net framework”。“.net”开发框架的推出,的确解决了com技术的许多困惑,也包括本技术方案所要解决的一些技术问题。然而“.net framework”是一个“改朝换代”的变化,要想一步将原来基于c++的系统(尤其是大型系统)完全移植到“.net”平台上是不可想象的,其工作量不亚于重新开发,所以microsoft特别推荐从com技术到“.net”平台的平滑移植。由此看来,本文提出的动态组件化的技术更显得可贵,它从工程化的角度,着眼于实际应用,解决了从面向对象的c++到基于组件的com技术的许多问题,既充分保护了原有系统的积累,又为这些系统搭上日益发展的“.net”快车提供了可能。
参考文献
《com原理与应用》,潘爱民 著,清华大学出
上一页 [1] [2] [3] 下一页