您的位置:首页 > 编程语言 > C语言/C++

从C++到COM,学习笔记(3)

2015-08-24 17:13 323 查看
转自:http://blog.sina.com.cn/s/blog_701b41e40100m4jv.html

类厂以及COM对象的构造

一. 类和对象

在OO语言中操作是基于对象进行的,而对象的抽象归纳就是类。但是这只是分析阶段的思考,当真正编程的时候顺序是倒过来的,先定义类,然后再在程序中将类具体实例化成为对象。以C++为例,先定义好一个类CA,然后在程序中用new CA()的方法就可以得到一个指向CA的对象。不过,我们能通过这样简单的操作来生成对象,其实是因为C++编译器帮我们做了很多工作:分配内存,建立虚函数表,初始化数据,调用构造函数,等等。即便是自己重载new操作符,也要或多或少的借助编译器的智能来实现所有步骤。

但是,编译器无法智能生成C++对象,它唯一的依据就是就是C++类,因此从OO思想上说,类是对象的抽象,但如果在编程中具体的说,类只是生成对象的准则而已。

对COM中的概念而言,恰恰和分析的顺序一致而和C++的顺序相反。COM首先根据C++对象在内存中的二进制格式定义了COM对象,然后再把生成COM对象的准则抽象出来成了COM类。因为COM并不一定要用OO实现,所以COM类和OO中的类其实是有差别的……尽管大多数时候我们是用C++来实现,此时就会发现两者本质上是一样的。

二. 类厂概念的引入

类厂(ClassFactory)这个名词其实有点迷惑性,因为这个东西实际上应该叫对象工厂。类厂也是一个普通的COM对象,它有一个特殊的接口IClassFactory,这个接口的一个函数CreateInstance()能够生成COM对象,并返回其需要的接口。

如果把C++中的概念平移过来,就会发现类厂的作用本质上就是那个被C++编译器隐藏了的new。在COM中没有类定义,自然也没有new,要想生成COM对象,只能靠COM类的规范。类厂就实现了从COM类规范到COM对象的过程。

当用C++实现COM的时候,往往在类厂也就是new出来一个对象,然后做一个QueryInterface()得到接口指针。表面上看,中间多了类厂这么一层有点多此一举,实际上这里隐含了根据抽象的COM类在内存中生成COM对象的步骤,绝非可有可无的。

三. 类厂的返回值

在前面说过COM中以COM对象为单位实行重用,COM对象通过接口和外界交互,COM对象的接口之间可以通过偏移来实现跳转。并且,从二进制上看,指向COM对象的指针就是指向COM对象继承的第一个接口的指针。所以,在COM中并不需要一个指向COM对象的指针,而只需要指向该COM对象的某一个接口的指针。因此类厂最后是返回COM对象的一个接口指针来告诉用户,这个COM对象已经生成了。当然,这个接口指针的表识(IID)需要用户提供。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: