【原创翻译】COM入门简介 -- 什么是COM , 怎样使用它 (3)

翻译 2007年10月02日 13:39:00
Introduction to COM - What It Is and How to Use It
By Michael Dunn
From www.codeproject.com

/**********原创翻译,转载请注明出处*********** 新手水平有限,欢迎批评指教 By FreeKid /

COM入门简介 -- 什么是COM , 怎样使用它 (3)

删除COM对象

按照前文所说的,你不用去释放COM对象,需要做的仅仅是告诉它们你使用完了。每个COM对象实现的IUnknown接口都有一个Release()方法。你应该调用这个方法通知COM对象你不再需要它了。一旦调用了Release(),COM对象就从内存中消失,因此也就不能再使用接口指针了。

如果你的应用程序使用许多不同的COM对象,那么当你使用完接口之后调用Release()就显得极为重要。如果你不释放(release)接口,COM对象(还有包括代码的那些DLLs)将被保存在内存中,并且毫无必要的加入到你的应用程序中。如果应用程序要运行很长一段时间,在程序闲时,你应该调用CoFreeUnusedLibraries()函数。这个函数将卸载没有显著作用的COM服务器,这也能减少应用程序的内存使用量。

继续上面的示例,下面展示应该如何使用Release():

// Create COM object as above.  Then...

    
if ( SUCCEEDED ( hr ) )
        
...{
        
// Call methods using pISL here.

        
// Tell the COM object that we're done with it.
        pISL->Release();
        }

IUnknown接口将在下一部分详细说明。

基本接口 - IUnknown

每个COM接口都是从IUnknown继承而来。这个名字有点容易让人误解,因为实际它并不是一个未知(unknown)接口。这个名字意味着即使你有了一个指向COM对象的IUnknown指针,你也不会知道它下面的对象是什么,因为每个COM对象都实现了IUnknown。

IUnknown 有三个方法:

1.  AddRef() - 告知COM对象增加它的引用计数。如果你拷贝了一个接口指针,你就需要使用这个方法,无论原始指针还是拷贝的副本都需要使用。在本文中,我们不必使用AddRef()方法。

2. Release() - 告知COM对象减少它的引用计数。你可以从前面的代码片段中找到关于Release()的说明。

3. QueryInterface() - 从COM对象中获取一个接口指针。当COClass实现二个或二个以上接口的时候,需要使用这个方法。

我们已经了解Release()是怎样运作的,那么QueryInterface()又是怎样的呢?当你用CoCreateInstance()创建一个COM对象的时候,你将得到一个接口指针。如果COM对象实现了二个或二个以上的接口(不包括IUnknown),你可以使用QueryInterface()来获取任意你想要的额外指针。QueryInterface()的原型如下:

HRESULT IUnknown::QueryInterface (
    REFIID iid,
    
void** ppv );

参数如下:

iid

    所请求接口的IID

ppv

    接口指针的地址。如果调用成功,QueryInterface()则通过这个参数返回接口。

让我们继续那个快捷方式的的示例。生成快捷方式的COClass实现了IShellLink和IPersistFile接口。如果你已经有个一个IShellLink指针pISL,那面你可以像下面一样来从COM对象中获取IPersistFIle接口:

HRESULT hr;
IPersistFile
* pIPF;

    hr 
= pISL->QueryInterface ( IID_IPersistFile, (void**&pIPF );

之后你可以用SUCCEEDED宏测试hr,然后证明QueryInterface()是否成功运行了。如果成功,你就可以像使用其它接口一样使用新的接口指针pIPF了。当然,在你使用完毕后,一定要调用pIPF->Release()。

(未完待续)

kafka入门:简介、使用场景、设计原理、主要配置及集群搭建http://www.aboutyun.com/thread-9341-1-1.html

文章转自:http://www.aboutyun.com/thread-9341-1-1.html 问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许...

【原创】使用vc向导简历的ATL COM简单对象好像没有IUnknown接口的实现?

  这两天看了看COM和ATL,还是有点云里雾里的感觉。对ATL如何实现COM的一个可创建对象还是不太明白,只知道一些概念。知识仅局限于能够使用VC 的向导简历一个ATL工程,增加一个ATL简单对象,...
  • ppslide
  • ppslide
  • 2011年06月17日 13:27
  • 595

HTML5之SVG详解(一) 时间 2012-12-21 19:49:00 博客园-原创精华区 原文 http://www.cnblogs.com/hupeng/archive/2012/12/2

1、背景 SVG是Scalable Vector Graphics的缩写,意为可缩放矢量图形。1998年,万维网联盟成立了一个工作组,研发一种通过XML来表现矢量图形的技术——SVG!由于SVG...

默写js日历控件和详细注释(非原创 原作者:@author KimSoft (jinqinghua [at] gmail.com)

一直对日历控件很感兴趣,感觉很深奥的东西,最近也在努力学习js,看了几本js的经典入门书籍,看完就忘了,就想着看了看 其他大牛写得日历控件,看完了自己尝试着按照他们的思路写了一个,基本算是默背下来的...
  • longvs
  • longvs
  • 2013年09月08日 23:49
  • 1085

COM入门简介

COM简单来说在不同应用和语言之间提供了一种二进制代码级分享途径的方法。这和C++重用代码有很大不同,C++只是提供了一种源代码级的 代码重用(ATL就是一个很好的例子)它的调用者只能使用C++语言,...

李望 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-10000290

一次汇编分析的经历关键词(为了搜索引擎优化,为了点击量)寄存器、ia32、AT&T汇编、intel汇编、x86架构、x64架构背景为了想知道为什么i++ ++i不是原子操作测试方法编写两个程序,调用o...

王鸿飞原创作品转载请注明出处《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-10000

《软件工程》学习心得与感悟             还清楚地记得入学面试时院长问我的问题,“为什么要报考软件学院”?我坚定地回答,“我要来科大学习专业、规范的软件工程,成为一名优秀的软件工程师!”...
  • whfauto
  • whfauto
  • 2016年11月19日 20:29
  • 374

Python NLTK学习6(创建词性标注器)除特别注明外,本站所有文章均为刘杰的个人网站原创 转载请注明出处: http://www.burnelltek.com/blog/60740e24d2f

除特别注明外,本站所有文章均为刘杰的个人网站原创 转载请注明出处: http://www.burnelltek.com/blog/60740e24d2f711e6841d00163e0c0e36...
  • AMDS123
  • AMDS123
  • 2017年03月28日 20:40
  • 6009
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【原创翻译】COM入门简介 -- 什么是COM , 怎样使用它 (3)
举报原因:
原因补充:

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