接上篇http://www.cnblogs.com/Clingingboy/archive/2011/06/14/2081019.html

一.封装生命周期步骤

由于以上过程容易出错,所以在CComCreator 对其生命周期调用进行了封装

template <class T1>
class CComCreator
{
public:_Success_(return == S_OK) static HRESULT WINAPI CreateInstance(_In_opt_ void* pv, _In_ REFIID riid, _Deref_out_ LPVOID* ppv){ATLASSERT(ppv != NULL);if (ppv == NULL)return E_POINTER;*ppv = NULL;HRESULT hRes = E_OUTOFMEMORY;T1* p = NULL;ATLPREFAST_SUPPRESS(6014)/* prefast noise VSW 489981 */ATLTRY(p = new T1(pv))
ATLPREFAST_UNSUPPRESS()if (p != NULL){p->SetVoid(pv);p->InternalFinalConstructAddRef();hRes = p->_AtlInitialConstruct();if (SUCCEEDED(hRes))hRes = p->FinalConstruct();if (SUCCEEDED(hRes))hRes = p->_AtlFinalConstruct();p->InternalFinalConstructRelease();if (hRes == S_OK)hRes = p->QueryInterface(riid, ppv);if (hRes != S_OK)delete p;}return hRes;}
};

现在创建对象又简化了一些

class CPenguin : ... {
public:...typedef CComCreator<CComPolyObject<CPenguin> > _CreatorClass;
};
STDMETHODIMP CAviary::CreatePenguin(IBird** ppbird) {return CPenguin::_CreatorClass::CreateInstance(0,IID_IBird,(void**)ppbird);
}

二.使用CComCoClass 进一步简化

由于CreateInstance方法很常用,进一步简化就是继承一个既有封装好的类,就是CComCoClass,其实现方式是一样的

template <class T, const CLSID* pclsid = &CLSID_NULL>
class CComCoClass {
public:                                                         ...                                                         template <class Q>                                          static HRESULT CreateInstance(IUnknown* punkOuter, Q** pp) {return T::_CreatorClass::CreateInstance(punkOuter,      __uuidof(Q), (void**) pp);                          }                                                           template <class Q>                                          static HRESULT CreateInstance(Q** pp) {                     return T::_CreatorClass::CreateInstance(NULL,           __uuidof(Q), (void**) pp);                          }
};

三.用宏简化CComCreator的创建

#define DECLARE_POLY_AGGREGATABLE(x) public:\      typedef ATL::CComCreator< \                      ATL::CComPolyObject< x > > _CreatorClass;

现在简化成这样(或者将DECLARE_AGGREGATABLE放在CComCoClass内部)

class CPenguin : public CComCoClass<CPenguin, &CLSID_CPenguin> {
public:...DECLARE_AGGREGATABLE(CPenguin)
};

四.是否支持聚合(CComFailCreator)

转载于:https://www.cnblogs.com/Clingingboy/archive/2011/06/15/2081782.html

ATL-CComCreator(CComCoClass的使用)相关推荐

  1. ATL 开发 COM 过程中的一些经验、问题总结

    ATLVC 6.0环境下,VS里面类似. ATL项目名称:TestAtl 接口:ITestInterface 实现类:CTestInterface 方法名称:Myfun Error:cannot in ...

  2. COM组件 ATL的创建和调用

    参考: - VS: VS2015创建ATL - VC:VC6.0创建ATL 实例 1. 包含两个接口: Student,Teacher 2. Student接口包含5个函数(方法) 3. Teache ...

  3. vs2015制作供js调用的ATL组件dll库详解

    ATL组件和mfc ActiveX组件都可以供网页去调用,在我其它的博客中详细讲述了ocx组件的开发方式以及在网页中如何调用,在这篇博客中将详细讲解ATL组件的开发以及在网页中的调用. 1 创建ATL ...

  4. ATL之深入浅出书评(潘爱民)

    ATL之深入浅出 介绍一本关于ATL的书<ATL Internals> 潘爱民,5月7日,2000年 北京大学计算机研究所,100871 引言 面对计算机图书市场的繁荣景象,我经常感叹今天 ...

  5. 用ATL创建COM组件详细解说

    一.创建一个模型(工程) MyProj. 二.给模型(工程)增加一个组件 MyCom. 三.给组件增加方法(函数) MyF1.MyF2.MyF3.MyF4. 一.创建模型(工程) MyProj 在VC ...

  6. 用ATL创建COM组件(详细分析了ATL创建的各种文件的意义,看完之后ATL就入门了)

       转载自: http://www.cppblog.com/ice197983/articles/4178.html 其他不错的资源: http://technet.microsoft.com/zh ...

  7. 用ATL创建COM组件及实例讲解

    一.创建一个模型(工程) MyProj. 二.给模型 ( 工程 ) 增加一个组件 MyCom . 三.给组件增加方法 ( 函数 ) MyF1 . MyF2 . MyF3 . MyF4 . 一.创建模型 ...

  8. 【转】用ATL创建COM组件详细解说

      用ATL创建COM组件一.创建一个模型(工程) MyProj. 二.给模型(工程)增加一个组件 MyCom. 三.给组件增加方法(函数) MyF1.MyF2.MyF3.MyF4. 一.创建模型(工 ...

  9. ATL的GUI程序设计(3)

    第三章 ATL的窗口类 CWindowImpl.CWindow.CWinTraits,ATL窗口类的奥秘尽在此三者之中.在本章里,李马将为你详细解说它们的使用方法.另外,本章的内容也可以算是本书的核心 ...

最新文章

  1. 3名女研究生,状告哈佛!
  2. 计算机改名后无法上网,CDEF磁盘分区无法修改名字修复方法
  3. [bzoj3670][2014湖北省队互测week2]似乎在梦中见过的样子
  4. python【数据结构与算法】贝祖定理简单讲解
  5. [WinSock]封装WSAAsyncSelect!
  6. java.util.concurrent简介
  7. 正则表达式格式化日期
  8. QQ浏览噐怎么拍照识题 QQ浏览器拍照识题教程介绍说明
  9. 知乎高赞:Serverless 能取代微服务吗?
  10. 15.高性能MySQL --- 备份与恢复
  11. html编写回到顶部,html回到顶部代码
  12. 医药行业的销售数据如何分析?
  13. 谣言检测论文精读——1.IJCAI2016-Detecting Rumors from Microblogs with Recurrent Neural Networks
  14. This'is wath!
  15. Unity——RectTransform详解
  16. Bi-Direction attention flow for machine reading(原理篇)
  17. spa:单页web应用(介绍,实现思路及技术点,路由,router-link相关属性)
  18. 拒绝忽悠——Python帮你来网购
  19. Weisfeiler-Lehman(WL)算法测试图同构
  20. IANA Time Zone Database 和 ZONEINFO 详解

热门文章

  1. Android安全笔记-Tasks与Recents Screen与Fragment基本概念
  2. Arduino学习笔记-新的按键控制方式
  3. C++笔记-Stack around the variable问题解析
  4. Spring中使用XML方式导入Spring配置文件,Boot中使用全注解导入Spring配置
  5. 丘成桐中学计算机科学奖,丘成桐中学科学奖
  6. data fastboot 擦除_fastboot擦除恢复等待设备【专业修复数据】
  7. flstudio插件找不到_【干货】音频插件完全指引手册
  8. (王道408考研操作系统)第二章进程管理-第四节2:死锁处理策略之避免死锁(银行家算法)
  9. 8-3:C++继承之继承中的作用域,隐藏,重定义和静态成员
  10. Linux系统编程8:入门篇之简单明了说明如何在Linux中Git提交代码