3.COM可重用性——包容
来源:互联网 发布:紫日软件 编辑:程序博客网 时间:2024/05/03 11:27
前面说的都是COM的模块化,体现COM组件的封装和多态特性,而实际上COM另一大特征是在二进制级别的可重用性,包括包容和聚合。本次介绍包容,下次介绍聚合。
如下,同样借用《COM原理与应用》的图,如下:
所谓包容就是对象B在实现ISomInterface接口时,调用对象A的接口来完成这个功能。换个角度看,其实相当于对象B充当我们客户程序的角色,本来是要由B完成功能调用A来完成了,整个过程客户完全感觉不到对象A的存在,所以称作包容。
下面直接看代码实现,接着上篇博客的实现,以上文的实现的COM对象做A,本次实现新的对象B,包容对象A的IAge接口,
首先,在对象B中增加个初始化函数Init,查询得到对象A的IAge接口,如下
HRESULT CPeople::Init(){HRESULT hr = CoCreateInstance(CLSID_EasyComPeople, NULL, CLSCTX_INPROC_SERVER, IID_IAge, (LPVOID*)&m_pAge);if (FAILED(hr)){return E_FAIL;}else{return S_OK;}}然后,在对象B实现IAge接口功能的时候,调用对象A的IAge接口来完成这个功能,
//IAgeHRESULT STDMETHODCALLTYPE CPeople::PrintAge( int nAge ){return m_pAge->PrintAge(nAge);}这样便完事大吉了,包容实现就是这么简单。
前面说过了对象B相当于我们客户程序的角色,这里可以看到在对象B实现IAge的功能的时候,除了调用对象A的Iage功能,还可以在之前或之后加上很多自己的功能。
下面处理下收尾工作,
何时调用Init函数呢,答案实在工厂对象创建对象B实例的时候,如下
//IClassFactoryHRESULT STDMETHODCALLTYPE CPeopleFactory::CreateInstance( _In_ IUnknown *pUnkOuter, _In_ REFIID riid, _Out_ void **ppvObject ){CPeople *pObj = NULL;HRESULT hr = S_FALSE;*ppvObject = NULL;//创建组件对象pObj = new CPeople;if (pObj == NULL){return hr;}//初始化包容对象hr = pObj->Init();if (FAILED(hr)){delete pObj;return hr;}//获得非托管第一个接口指针hr = pObj->QueryInterface(riid, ppvObject);if (S_OK != hr){delete pObj;}return hr;}最后,在对象B销毁的时候,释放对象A的接口
CPeople::~CPeople(){g_EasyComNumber--;//组件引用计数if (m_pAge!=NULL){m_pAge->Release();}}
本文完整演示代码下载链接
原创,转载请注明来自http://blog.csdn.net/wenzhou1219
0 0
- 3.COM可重用性——包容
- COM--可重用性(包容和聚合)
- COM的“可重用性”特性包括两种模型:包容和聚合
- COM“可重用性”的两种模型:包容和聚合
- 4.COM可重用性——聚合
- VB COM基础讲座之可重用性
- 什么是可重用性
- 聚合 包容 COM
- COM对象包容
- 可重用性的克服
- 软件可重用性思考
- 开发工具,重用,可移植性——unix编程艺术学习笔记
- Unix编程艺术——优化、工具、重用、可移植性、文档
- COM 的聚合和包容
- COM笔记-包容与聚合
- COM特性 包容和聚合
- COM笔记-包容与聚合
- COM笔记-包容与聚合
- css基础
- ASP.NET DataList嵌套实现评论效果
- QtQuick.Controls 2.0:Frame Pane GroupBox
- 结构体的大小
- 【rqnoj】PID343 mty的考验
- 3.COM可重用性——包容
- python rabbitmq 服务实例--图片流上传oss
- 2016年吉怀交流赛有感
- 嵌入式数据库 SQLite 浅析
- Hdu 2899 Strange fuction(二分三分可做,模拟退火解法)
- 微信6.0 ActionBar样式
- 如何调用Sphinx
- Java-Web开发基础之html语法基础
- WIN10无法使用中文输入法解决方案