C++类的动态组件化技术(8)
作者:佚名; 更新时间:2014-12-05

  在从该模板类派生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++类的继承关系也应该体现在各个接口上,如下图所示:

  

C++类的动态组件化技术

核心期刊快速发表
Copyright@2000-2030 论文期刊网 Corporation All Rights Reserved.
《中华人民共和国信息产业部》备案号:ICP备07016076号;《公安部》备案号:33010402003207
本网站专业、正规提供职称论文发表和写作指导服务,并收录了海量免费论文和数百个经国家新闻出版总署审批过的具有国内统一CN刊号与国际标准ISSN刊号的合作期刊,供诸位正确选择和阅读参考,免费论文版权归原作者所有,谨防侵权。联系邮箱:256081@163.com