COM学习笔记1_COM初步探索

转载 2016年01月11日 22:16:56


原文:http://blog.csdn.net/hongjiqin/article/details/4433888


COM组件的两个重要需求:
1。 动态链接
2。 隐藏实现细节

COM初步探索

一个典型C++客户和组件的例子

// 组件模块
interface IX
{
	virtual void __stdcall Fx1() = 0 ;
	virtual void __stdcall Fx2() = 0 ;
} ;
interface IY
{
	virtual void __stdcall Fy1() = 0 ;
	virtual void __stdcall Fy2() = 0 ;
} ;
// Interface implementation
class CA : public IX, 
           public IY
{
//......
} ;
// 客户模块
int main()
{
	CA* pA = new CA ;
	pA->Fx1() ;
	pA->Fx2() ;
	
	pA->Fy1() ;
	pA->Fy2() ;
	
	delete pA ;
}

在COM中,推荐使用接口的指针来使用组件,上面客户端可以改成如下工作:

// 客户模块
int main()
{
 CA* pA = new CA ;
 // Get an IX pointer.
 IX* pIX = pA ;
 pIX->Fx1() ;
 pIX->Fx2() ;
 // Get an IY pointer.
 IY* pIY = pA ;
 pIY->Fy1() ;
 pIY->Fy2() ;
 delete pA ;
}


在COM中,推荐使用接口的指针来使用组件,上面客户端可以改成如下工作:

// 客户模块
int main()
{
	CA* pA = new CA ;
	// Get an IX pointer.
	IX* pIX = pA ;
	pIX->Fx1() ;
	pIX->Fx2() ;
	// Get an IY pointer.
	IY* pIY = pA ;
	pIY->Fy1() ;
	pIY->Fy2() ;
	delete pA ;
}


接下来问题是:
1。 CA* pA = new CA ;
这里暴露太多细节,最起码客户需要类CA的头文件声明,这里把类CA的内部细节(私有成员)都暴露了,
而且当CA的实现细节改动,客户端肯定需要重新编译代码。
另外COM组件可能不在客户进程中,甚至在远程机器上,这样就不可能简单new出组件实例。

2。delete pA ;
这里需要显示释放组件。
但pIX和pIY也指向pA的对象,delete pA后如果再使用pIX等就会发生错误。
容易造成代码维护困难。

解决方案是所有接口派生自IUnknown。
IUnknown提供QueryInterface,AddRef和Release接口。
另外提供函数CreateInstance。

对于上面问题1,通过CreateInstance创建组件,并返回IUnknown接口指针,
然后通过QueryInterface再获取各种接口的指针。

对于上面问题2,每次获取组件指针时(自动)调用AddRef,该指针不再使用时调用Release。
组件内部维护引用计数,当计数为0时自动释放自己。这样就不需要手动new和delete了。

现在组件和客户代码如下:

// 组件代码
interface IX : IUnknown
{
	virtual void __stdcall Fx() = 0 ;
} ;
interface IY : IUnknown
{
	virtual void __stdcall Fy() = 0 ;
} ;
// Forward references for GUIDs
extern const IID IID_IX ;
extern const IID IID_IY ;
class CA : public IX,
           public IY
{
	virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) ;			
	virtual ULONG __stdcall AddRef() { return 0 ;}
	virtual ULONG __stdcall Release() { return 0 ;}
	virtual void __stdcall Fx() { cout << "Fx" << endl ;}
	virtual void __stdcall Fy() { cout << "Fy" << endl ;}
} ;
IUnknown* CreateInstance()
{
	IUnknown* pI = static_cast<IX*>(new CA) ;
	pI->AddRef() ;
	return pI ;
}
// 客户代码
int main()
{
	IUnknown* pIUnknown = CreateInstance() ;
	IX* pIX = NULL ; 
	if (SUCCEEDED (pIUnknown->QueryInterface(IID_IX, (void**)&pIX)))
	{
		pIX->Fx() ;          // Use interface IX.
	}
	IY* pIY = NULL ;
	if (SUCCEEDED (pIUnknown->QueryInterface(IID_IY, (void**)&pIY)))
	{
		pIY->Fy() ;          // Use interface IY.
		pIY->Release() ;
	}
	IY* pIYfromIX = NULL ;
	if (SUCCEEDED (pIX->QueryInterface(IID_IY, (void**)&pIYfromIX)))
	{	
		pIYfromIX->Fy() ;
		pIYfromIX->Release() ;
	}
	pIX->Release() ;
	pIUnknown->Release() ;
}


安卓基础到入门学习(复习笔记)

一、Android 基本常识1、写 10 个简单的 linux 命令mkdir 创建文件夹 rmdir 删除文件夹 rm 删除文件 mv 移动文件 cp 拷贝文件 cat 查看文件 tail 查看文件...
  • android_ty
  • android_ty
  • 2016年05月06日 11:18
  • 1849

数据库笔记(自己学习过程中整理)

编程语言是实现对内存的操作比较方便,对硬盘数据的操作数据库比较方便   一、数据库如何存储数据的 字段,记录,表,约束(主键,外键,唯一键,非空,check,default)   二、如何操作数据 i...
  • Caster_Saber
  • Caster_Saber
  • 2015年05月17日 16:20
  • 1660

初学vue.js——学习笔记一

工作之余不忘学习,不怕学得晚,就怕不坚持。加油! 1、双向绑定 (v-model:P和input内容同步更新) html:    {{message}}    v-model="message">...
  • dihuiqin
  • dihuiqin
  • 2016年08月05日 11:28
  • 2239

机器学习初步与微积分概率论-七月算法(julyedu.com)4 月机器学习算法班学习笔记

高等数学回顾 夹逼定理 泰勒公式 凸函数 概率论 商品推荐-惊喜度 常见分布统计量小结高等数学回顾夹逼定理泰勒公式从泰勒公式看熵和基尼系数的关系 凸函数 两个要点 1. 定义域是凸集 2. 函...
  • zhzhji440
  • zhzhji440
  • 2016年05月05日 21:27
  • 489

COM学习笔记1

在学习COM时,对COM的一大堆实现原理看了一大通,基本上想自己理解了。于是想现在该我来写一个COM了吧,但打开IDE却不知如何下手。我该怎么办? 在网上一收发现一个叫杨老师的前辈已经给我写了一个详...
  • fengbangyue
  • fengbangyue
  • 2011年09月03日 17:05
  • 992

从C++到COM,学习笔记(1)

转自:http://blog.sina.com.cn/s/blog_701b41e40100m4jw.html COM的产生   一. 为什么要引入COM? 先给一...
  • dzm12
  • dzm12
  • 2015年08月24日 16:44
  • 192

HMM学习笔记_1(从一个实例中学习DTW算法)出处:http://www.cnblogs.com/tornadomeet

DTW为(Dynamic Time Warping,动态时间归准)的简称。应用很广,主要是在模板匹配中,比如说用在孤立词语音识别,计算机视觉中的行为识别,信息检索等中。可能大家学过这些类似的课程都看到...
  • AiTODD1
  • AiTODD1
  • 2014年09月10日 21:37
  • 369

COM学习笔记和测试程序2

  • 2012年03月28日 21:29
  • 174KB
  • 下载

Spring scope学习笔记 easy518网址导航:easy518.com

  • 2011年06月02日 16:30
  • 4KB
  • 下载

COM学习笔记和测试程序

  • 2012年03月26日 22:17
  • 186KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM学习笔记1_COM初步探索
举报原因:
原因补充:

(最多只允许输入30个字)