COM入门3(引用)

转载 2007年10月04日 11:35: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()。

(未完待续)


 

推荐几款COM组件开发的入门书籍

推荐几本个人读过的比较不错的COM组件相关的书籍,按我的阅读感受排名如下: 1,《Visual C++实践与提高-COM和COM+篇》         这本书我放在第一位,倒不是它有多么出色,但...
  • ghevinn
  • ghevinn
  • 2014年01月25日 17:37
  • 6589

Com编程入门——什么是COM,如何使用COM

本文的目的是为刚刚接触COM的程序员提供编程指南,并帮助他们理解COM的基本概念。内容包括COM规范简介,重要的COM术语以及如何重用现有的COM组件。本文不包括如何编写自己的COM对象和接口。  ...
  • mao0514
  • mao0514
  • 2013年09月30日 08:17
  • 1308

UEditor简单入门使用

学习Java已经有一段时间了,去某机构培训了一个月,觉得
  • wtt19940525
  • wtt19940525
  • 2014年07月26日 01:54
  • 1251

html5新手入门---来自于对www.w3cschool.com的总结。

在html5中对音频和视频的处理比以前更加简单。    Your browser does not support the audio element.上面这段代码实现的事音频的播放。其中每一个src...
  • shuiyichuan
  • shuiyichuan
  • 2013年11月18日 14:59
  • 1820

【TRIO-Basic从入门到精通教程八】QT使用Trio com组件编程实战

大家好,今天给大家带来一篇关于QT添加TRIO com组件的编程例程,给初次使用的朋友带来捷径之路。 首先,我们要使用TRIO COM组件,需要安装trio com组件程序。组件程序到官网下载最新版,...
  • guimotion
  • guimotion
  • 2017年03月22日 21:53
  • 995

ATL COM 新手入门教程

http://3140618.blog.163.com/blog/static/745179720116131012285/ 介绍 本教程的目的是告诉你如何使用ATL创建一个COM...
  • chla
  • chla
  • 2012年12月18日 10:25
  • 326

编译和链接的区别(转载自从入门到放弃的博客http://blog.sina.com.cn/floatingstars)

一个源程序到一个可执行程序一般需要经过预编译、编译、汇编和链接四个步骤。当我们使用IDE编写代码的时候,这些过程IDE都会默认的为我们完成。但是了解这些过程都是做什么是很有必要的。 1、预编译 ...
  • lurendetiankong
  • lurendetiankong
  • 2016年12月03日 17:52
  • 324

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

转载自: http://www.cppblog.com/ice197983/articles/4178.html 其他不错的资源: http://technet.microsoft....
  • huangxy10
  • huangxy10
  • 2013年05月14日 04:32
  • 2905

Com入门1

最近需要用到COM知识,总结一下刚学到的知识。 1. 什么是COM COM全称是Component Object Model,中文译为组件对象模型。COM组件在物理上是一些DLL或EXE文件;...
  • hhhbbb
  • hhhbbb
  • 2012年06月05日 09:51
  • 401

COM控件快速入门

 1.什么是COM COM是一种跨应用和语言共享二进制代码的方法。与C++不同,它提倡源代码重用。ATL便是一个很好的例证。源码级重用虽然好,但只能用于C++。它还带来了名字冲突的可能性,更不...
  • liuyanhuasd
  • liuyanhuasd
  • 2016年03月16日 11:54
  • 184
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM入门3(引用)
举报原因:
原因补充:

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