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入门3

本篇介绍COM注册TypeLib,CLR程序调用COM组件;注册ProgID及ProgID和CLSID相互映射等。 1. 注册TypeLib IDL在MIDL编译后会生成一个.tlb文件,这个...

sbt入门指南翻译(3)范围轴/ 库引用--渣翻译有错误望指教

Scope axes(范围轴) 一个返回轴是一种类型,每一个类型实例可以定义它自己的范围 (这就是每个实例可以拥有它自己唯一的key对于的值)   这里有三个范围轴: 1.      项目 ...

COM编程入门

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

【COM编程入门】

第一部分——什么是COM,如何使用COM   本文的目的是为刚刚接触COM的程序员提供编程指南,并帮助他们理解COM的基本概念。内容包括COM规范简介,重要的COM术语以及如何重用现有的COM组件。...

COM技术入门基础知识

这几天在学习COM组件技术,网上看了很多教程,发现有一些很基础的东西基本都没有涉及,下面我就结合网上的一些教程加上自己的体会来进行一些总结。   (1)COM组件是什么?    COM组件...

COM编程入门

http://www.vckbase.com/document/viewdoc/?id=212 本文的目的是为刚刚接触COM的程序员提供编程指南,并帮助他们理解COM的基本概念。内容包括COM规...

(转自hzwer.com)树状数组入门

如果给定一个数组,要你求里面所有数的和,一般都会想到累加。但是当那个数组很大的时候,累加就显得太耗时了,时间复杂度为O(n),并且采用累加的方法还有一个局限,那就是,当修改掉数组中的元素后,仍然要你求...

vim快速入门【实验楼系列shiyanlou.com】

转载自:http://blog.csdn.net/Icarus_/article/details/49045575vim模式介绍 以下介绍内容来自维基百科Vim从vi演生出来的Vim具有多种模式,这...

COM组件入门(一)

最近需要用到COM组件的知识,看了看COM编程指南,感觉还不错,把我的学习心得记录下来。这是我写

COM编程入门(一)

第一部分 什么是COM,如何使用COM  本文的目的是为刚刚接触COM的程序员提供<a clas 第一部分 什么是COM,如何使用CO
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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