一个土问题,关于COM对象的创建 因为生活所迫,这几天必须对COM有所了解。今天看了之后,对COM对象的创建有所困惑。 使用CoCreateInstance和QueryInterface两种方法创建COM对象有何不同?例子程序如下: 代码: //Create a COM object from the Shell Link coclass 请大家指教,谢了! |
我看了IPersisteFile借口,继承关系如下:IPersisteFile->IPersist->IUnknown,他和pISL所指的IShellLink*有什么关系?必须通过调用pISL的QueryInterface方法创建? |
严格的来说,无论是CoCreateInstance还是QueryInterface,都不一定会创建新的对象,它们返回的都是一个接口。 不过一般CoCreateInstance会创建一个新的对象,然后返回一个接口。 QueryInterface则是返回一个现有对象上的其它接口。一般不创建新的对象(有例外,如tearoff) |
问题就出在这里:QueryInterface则是返回一个现有对象上的其它接口! COM里的接口和对象该怎么理解的问题! 那按这个说法 hr = pISL->QueryInterface ( IID_IPersistFile, (void**) &pIPF ); pIPF是pISL的一个子接口?嵌套??? |
我的建议是,你不必管它是什么。用就行了。 |
问题是这个心理障碍不克服我没法看下去的说!~~ :( :( :( 还有一个问题,就是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? |
component 是实体,interface 是访问它的手段。 这个我倒是建议你用类似 COM 的风格(纯的抽象接口,多继承)写一点 C++ 程序,比较容易理解。在那里你会看到一个具体的类派生自多个纯的抽象接口类,然后可以通过不同的接口访问一个具体类的对象。另外《COM 技术内幕》这本书写的不错,可能有助于理解。 |
elm, 我觉得你总把interface当作访问对象的手段是片面的。如果照你的说法,那么对象本身也提供访问它的手段,它不也是接口了? 实际上,对象就是接口。 所谓interface, 这个"face"很重要。它就是一个对象在你看来长什么样。至于它本身是什么,这并不重要。 class, 和factory一样,都是得到一个对象的途径。 形而上的说,世间一切东西,包括你我在内,都只是一些接口罢了。我们对父母是子女,对公司是员工,对妓女是客户,对老虎是食物。至于我们真正的实体,或者说本质是什么,也许除了上帝这个造物工厂,谁也不真正知道。 |
ajoo有点咬文嚼字了。 引用:
不过我觉得ajoo后面说得很对。我们可以认为对象是客观存在的,但是我们不可以用除了“接口”以外的方法感知到它。 |
啧啧,打算形而上的话,给个“interface”的确切定义先。 |
刚才有看了了一些东西,interface能不能理解成C++中的抽象类,只提供接口,不提供实现。而在Component Object Class中完成了对Interface的实现,所以我们先用CoCreateInstance创建一个COM对象实例,然后用QueryInterface得到一个Interface的指针去做某些事情? |
引用:
interface 就是你的使用对象的程序所能感知到的对象的方方面面(你怎么感知一个对象?当然是通过接口啦)。或者说,你主观反映出来的对象。 至于对象客观实质是什么,嘿嘿,六合之外,存而不论。 |
引用:
|
有点像C++里一个类可以继承多个虚基类,在COM里一个对象可以实现多个接口,接口是访问COM对象的唯一手段,对象使用CLSID来标识,其实现的接口由IID来标识。当一个对象支持多个接口时,使用QueryInterface可以从任意一个接口来访问其他接口。CoCreateInstance用来创建一个对象,但是COM不会将对象直接交给你,而是在CoCreateInstance内部调用QueryInterface来查询这个对象是否支持你所请求的接口,这就是为什么CoCreateInstance需要CLSID和IID的原因。实际上你可以自己实现CoCreateInstance(详见《COM原理与应用》第2章)。 像pora说的,凡事都有例外:CoCreateInstance并不保证一定返回一个新的对象的接口,一些singleton的对象在设计类工厂时总是返回一个对象的接口;而QueryInterface返回的接口并不一定是由调用的接口所在的对象来实现的,如果这个对象通过aggregation来使用另外的对象提供的服务的话,这时QueryInterface有可能导致新的对象的创建。 |
本文深入探讨了COM组件中如何利用CoCreateInstance函数创建对象,并详细阐述了QueryInterface方法在对象间接口查询的角色。通过实例解析,揭示了COM对象交互的关键步骤及其在实际开发中的应用。
1232

被折叠的 条评论
为什么被折叠?



