ATL-CComCreator(CComCoClass的使用)
接上篇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的使用)相关推荐
- ATL 开发 COM 过程中的一些经验、问题总结
ATLVC 6.0环境下,VS里面类似. ATL项目名称:TestAtl 接口:ITestInterface 实现类:CTestInterface 方法名称:Myfun Error:cannot in ...
- COM组件 ATL的创建和调用
参考: - VS: VS2015创建ATL - VC:VC6.0创建ATL 实例 1. 包含两个接口: Student,Teacher 2. Student接口包含5个函数(方法) 3. Teache ...
- vs2015制作供js调用的ATL组件dll库详解
ATL组件和mfc ActiveX组件都可以供网页去调用,在我其它的博客中详细讲述了ocx组件的开发方式以及在网页中如何调用,在这篇博客中将详细讲解ATL组件的开发以及在网页中的调用. 1 创建ATL ...
- ATL之深入浅出书评(潘爱民)
ATL之深入浅出 介绍一本关于ATL的书<ATL Internals> 潘爱民,5月7日,2000年 北京大学计算机研究所,100871 引言 面对计算机图书市场的繁荣景象,我经常感叹今天 ...
- 用ATL创建COM组件详细解说
一.创建一个模型(工程) MyProj. 二.给模型(工程)增加一个组件 MyCom. 三.给组件增加方法(函数) MyF1.MyF2.MyF3.MyF4. 一.创建模型(工程) MyProj 在VC ...
- 用ATL创建COM组件(详细分析了ATL创建的各种文件的意义,看完之后ATL就入门了)
转载自: http://www.cppblog.com/ice197983/articles/4178.html 其他不错的资源: http://technet.microsoft.com/zh ...
- 用ATL创建COM组件及实例讲解
一.创建一个模型(工程) MyProj. 二.给模型 ( 工程 ) 增加一个组件 MyCom . 三.给组件增加方法 ( 函数 ) MyF1 . MyF2 . MyF3 . MyF4 . 一.创建模型 ...
- 【转】用ATL创建COM组件详细解说
用ATL创建COM组件一.创建一个模型(工程) MyProj. 二.给模型(工程)增加一个组件 MyCom. 三.给组件增加方法(函数) MyF1.MyF2.MyF3.MyF4. 一.创建模型(工 ...
- ATL的GUI程序设计(3)
第三章 ATL的窗口类 CWindowImpl.CWindow.CWinTraits,ATL窗口类的奥秘尽在此三者之中.在本章里,李马将为你详细解说它们的使用方法.另外,本章的内容也可以算是本书的核心 ...
最新文章
- 3名女研究生,状告哈佛!
- 计算机改名后无法上网,CDEF磁盘分区无法修改名字修复方法
- [bzoj3670][2014湖北省队互测week2]似乎在梦中见过的样子
- python【数据结构与算法】贝祖定理简单讲解
- [WinSock]封装WSAAsyncSelect!
- java.util.concurrent简介
- 正则表达式格式化日期
- QQ浏览噐怎么拍照识题 QQ浏览器拍照识题教程介绍说明
- 知乎高赞:Serverless 能取代微服务吗?
- 15.高性能MySQL --- 备份与恢复
- html编写回到顶部,html回到顶部代码
- 医药行业的销售数据如何分析?
- 谣言检测论文精读——1.IJCAI2016-Detecting Rumors from Microblogs with Recurrent Neural Networks
- This'is wath!
- Unity——RectTransform详解
- Bi-Direction attention flow for machine reading(原理篇)
- spa:单页web应用(介绍,实现思路及技术点,路由,router-link相关属性)
- 拒绝忽悠——Python帮你来网购
- Weisfeiler-Lehman(WL)算法测试图同构
- IANA Time Zone Database 和 ZONEINFO 详解
热门文章
- Android安全笔记-Tasks与Recents Screen与Fragment基本概念
- Arduino学习笔记-新的按键控制方式
- C++笔记-Stack around the variable问题解析
- Spring中使用XML方式导入Spring配置文件,Boot中使用全注解导入Spring配置
- 丘成桐中学计算机科学奖,丘成桐中学科学奖
- data fastboot 擦除_fastboot擦除恢复等待设备【专业修复数据】
- flstudio插件找不到_【干货】音频插件完全指引手册
- (王道408考研操作系统)第二章进程管理-第四节2:死锁处理策略之避免死锁(银行家算法)
- 8-3:C++继承之继承中的作用域,隐藏,重定义和静态成员
- Linux系统编程8:入门篇之简单明了说明如何在Linux中Git提交代码