关于COM对象创建(CoCreateInstance,与QueryInterface)

关于COM对象创建(CoCreateInstance,与QueryInterface)panda2002-12-1905:40PM一个土问题,关于COM对象的创建 因为生活所迫,这几天必须对COM有所了解。今天看了之后,对COM对象的创建有所困惑。使用CoCreateInstance和QueryInterface两种方法创建COM对象有何不同?例子程序如下:代码://CreateaCOMobjectfromtheShellLinkcoclasshr=CoCr

大家好,又见面了,我是你们的朋友全栈君。

panda 2002-12-19 05:40 PM

一个土问题,关于COM对象的创建

 
因为生活所迫,这几天必须对COM有所了解。今天看了之后,对COM对象的创建有所困惑。

使用CoCreateInstance和QueryInterface两种方法创建COM对象有何不同?例子程序如下:

代码:

//Create a COM object from the Shell Link coclass
hr = CoCreateInstance ( CLSID_ShellLink,
                                        NULL,
                                        CLSCTX_INPROC_SERVER,
                                        IID_IShellLink,
                                        (void**) &pISL );

// Get an IPersisteFile interface from the COM object.
hr = pISL->QueryInterface ( IID_IPersistFile, (void**) &pIPF );


这两种方法有什么去区别?还是我的理解上有问题?原文中有这么一句:If it succeeded, you can then use the new interface pointer, pIPF, just like any other interface!那么按我的理解就是QueryInterface也创建了一个新的COM对象。

请大家指教,谢了!

panda 2002-12-19 06:10 PM

我看了IPersisteFile借口,继承关系如下:IPersisteFile->IPersist->IUnknown,他和pISL所指的IShellLink*有什么关系?必须通过调用pISL的QueryInterface方法创建?

polyrandom 2002-12-19 08:21 PM

严格的来说,无论是CoCreateInstance还是QueryInterface,都不一定会创建新的对象,它们返回的都是一个接口。

不过一般CoCreateInstance会创建一个新的对象,然后返回一个接口。

QueryInterface则是返回一个现有对象上的其它接口。一般不创建新的对象(有例外,如tearoff)

panda 2002-12-20 09:21 AM

问题就出在这里:QueryInterface则是返回一个现有对象上的其它接口!

COM里的接口和对象该怎么理解的问题!

那按这个说法

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

pIPF是pISL的一个子接口?嵌套???

polyrandom 2002-12-20 10:06 AM

我的建议是,你不必管它是什么。用就行了。

panda 2002-12-20 10:10 AM

问题是这个心理障碍不克服我没法看下去的说!~~

:( :( :(

还有一个问题,就是CoClass和Interface有什么区别?CLSID和IID呢?如果是一回事的话,

为什么

hr = CoCreateInstance ( CLSID_ShellLink, // CLSID of coclass

NULL, // not used – aggregation

CLSCTX_INPROC_SERVER, // type of server

IID_IShellLink, // IID of interface

(void**) &pISL ); // Pointer to our interface pointer

为什么又传CLSID又传IID?

Elminster 2002-12-20 01:24 PM

component 是实体,interface 是访问它的手段。

这个我倒是建议你用类似 COM 的风格(纯的抽象接口,多继承)写一点 C++ 程序,比较容易理解。在那里你会看到一个具体的类派生自多个纯的抽象接口类,然后可以通过不同的接口访问一个具体类的对象。另外《COM 技术内幕》这本书写的不错,可能有助于理解。

ajoo 2002-12-20 01:39 PM

elm, 我觉得你总把interface当作访问对象的手段是片面的。如果照你的说法,那么对象本身也提供访问它的手段,它不也是接口了?

实际上,对象就是接口。

所谓interface, 这个”face”很重要。它就是一个对象在你看来长什么样。至于它本身是什么,这并不重要。

class, 和factory一样,都是得到一个对象的途径。

形而上的说,世间一切东西,包括你我在内,都只是一些接口罢了。我们对父母是子女,对公司是员工,对妓女是客户,对老虎是食物。至于我们真正的实体,或者说本质是什么,也许除了上帝这个造物工厂,谁也不真正知道。

polyrandom 2002-12-20 02:12 PM

ajoo有点咬文嚼字了。

引用:

如果照你的说法,那么对象本身也提供访问它的手段,它不也是接口了?


在这里,你的“访问它的手段”,的确是一种interface?只是不是COM意义上的interface。

不过我觉得ajoo后面说得很对。我们可以认为对象是客观存在的,但是我们不可以用除了“接口”以外的方法感知到它。

Elminster 2002-12-20 02:13 PM

啧啧,打算形而上的话,给个“interface”的确切定义先。

panda 2002-12-20 02:48 PM

刚才有看了了一些东西,interface能不能理解成C++中的抽象类,只提供接口,不提供实现。而在Component Object Class中完成了对Interface的实现,所以我们先用CoCreateInstance创建一个COM对象实例,然后用QueryInterface得到一个Interface的指针去做某些事情?

ajoo 2002-12-21 12:39 AM

引用:

作者:
Elminster
啧啧,打算形而上的话,给个“interface”的确切定义先。

可以这样定义:

interface 就是你的使用对象的程序所能感知到的对象的方方面面(你怎么感知一个对象?当然是通过接口啦)。或者说,你主观反映出来的对象。

至于对象客观实质是什么,嘿嘿,六合之外,存而不论。

chen3feng 2003-12-08 06:01 AM

引用:

作者:
ajoo
elm, 我觉得你总把interface当作访问对象的手段是片面的。如果照你的说法,那么对象本身也提供访问它的手段,它不也是接口了?

实际上,对象就是接口。

所谓interface, 这个”face”很重要。它就是一个对象在你看来长什么样。至于它本身是什么,这并不重要。

class, 和factory一样,都是得到一个对象的途径。

形而上的说,世间一切东西,包括你我在内,都只是一些接口罢了。我们对父母是子女,对公司是员工,对妓女是客户,对老虎是食物。至于我们真正的实体,或者说本质是什么,也许除了上帝这个造物工厂,谁也不真正知道。


未必,我对老虎肯定是猎人,前提是手里有一把AK-47

famel 2003-12-09 12:02 AM

有点像C++里一个类可以继承多个虚基类,在COM里一个对象可以实现多个接口,接口是访问COM对象的唯一手段,对象使用CLSID来标识,其实现的接口由IID来标识。当一个对象支持多个接口时,使用QueryInterface可以从任意一个接口来访问其他接口。CoCreateInstance用来创建一个对象,但是COM不会将对象直接交给你,而是在CoCreateInstance内部调用QueryInterface来查询这个对象是否支持你所请求的接口,这就是为什么CoCreateInstance需要CLSID和IID的原因。实际上你可以自己实现CoCreateInstance(详见《COM原理与应用》第2章)。

像pora说的,凡事都有例外:CoCreateInstance并不保证一定返回一个新的对象的接口,一些singleton的对象在设计类工厂时总是返回一个对象的接口;而QueryInterface返回的接口并不一定是由调用的接口所在的对象来实现的,如果这个对象通过aggregation来使用另外的对象提供的服务的话,这时QueryInterface有可能导致新的对象的创建。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162925.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Unity3d场景快速烘焙【2020】

    Unity3d场景快速烘焙【2020】很多刚刚接触Unity3d的童鞋花了大量的时间自学,可总是把握不好Unity3d的烘焙,刚从一个坑里爬出来,又陷入另一个新的坑,每次烘焙一个场景少则几个小时,多则几十个小时,机器总是处于假死机状态,半天看不到结果,好不容易烘焙完了,黑斑、撕裂、硬边、漏光或漏阴影等缺陷遍布,惨不忍睹,整体效果暗无层次,或者苍白无力,灯光该亮的亮不起来,该暗的暗不下去,更谈不上有什么意境,痛苦的折磨,近乎失去了信心,一个团队从建模到程序,都没什么问题,可一到烘焙这一关,就堵得心塞,怎么也搞不出好的视觉效果,作品没法及时向用户交

    2022年6月11日
    29
  • Echarts整合(前后端、数据库)

    Echarts整合(前后端、数据库)

    2021年11月12日
    42
  • goland 2022 永久激活码_在线激活2022.03.13「建议收藏」

    (goland 2022 永久激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年4月2日
    2.9K
  • ArcGIS 制作中国区的数字高程DEM地图(附中国区STRM 90m DEM百度云免费下载链接)[通俗易懂]

    ArcGIS 制作中国区的数字高程DEM地图(附中国区STRM 90m DEM百度云免费下载链接)[通俗易懂]数字高程模型(DigitalElevationModel),简称DEM网上有很多中国DEM的下载链接,要么收费,要么地图不对(缺藏南、台湾等等),要么版本太老所以自己做了一个,流程如下:第一步:NASA官网下载STRM90m文件包(http://srtm.csi.cgiar.org)(i)第二张图的Tilesize就是在选区域下载,所以也可以选5x5degree,但就要选很多区域,而且下载的时候要一个个点,太麻烦了,30x30degree的话,只需要选六块就能包住中国;(ii)下载速度

    2025年8月18日
    30
  • AutoMapper学习

    AutoMapper学习http://automapper.org/这是一款DTO的映射工具,AutoMapper是基于对象到对象约定的映射工具,它可以把复杂的对象模型转为DTO,或者其他的–那些让设计更合理更适于序列化、通信、传递消息的简单对象或者干脆就只是在领域层与应用层之间搭建一个简单的ACL防护层(就像DTO一样,用于代码的显示转换)来增加各自层的相互独立性。简单来说就是:就是根据A的模型和B的模型中的定义,自动将A模型映射为一个全新的B模型。前言VO、DTO、DO、PO、DAOVO(ViewObject.

    2025年8月20日
    2
  • ViewPager滑动事件OnPageChangeListener

    ViewPager滑动事件OnPageChangeListener使用ViewPager控件的时候,需要实现OnPageChangeListener接口,而OnPageChangeListener这个接口时必须实现三个方法:onPageScrollStateChanged,onPageScrolled,onPageSelected方法。

    2022年7月22日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号